static int menu_setting_toggle(unsigned type, const char *dir, const char *label, unsigned action) { struct retro_perf_counter **counters = NULL; if ((menu_common_type_is(label, type) == MENU_SETTINGS_SHADER_OPTIONS) || !strcmp(label, "video_shader_parameters") || !strcmp(label, "video_shader_preset_parameters") ) return menu_shader_manager_setting_toggle(type, label, action); else if ((type >= MENU_SETTINGS_CORE_OPTION_START)) return menu_common_core_setting_toggle(type, action); else if (type >= MENU_SETTINGS_PERF_COUNTERS_BEGIN && type <= MENU_SETTINGS_PERF_COUNTERS_END) { counters = (struct retro_perf_counter**)perf_counters_rarch; return menu_common_setting_set_perf(type, action, counters, type - MENU_SETTINGS_PERF_COUNTERS_BEGIN); } else if (type >= MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_BEGIN && type <= MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_END) { counters = (struct retro_perf_counter**)perf_counters_libretro; return menu_common_setting_set_perf(type, action, counters, type - MENU_SETTINGS_LIBRETRO_PERF_COUNTERS_BEGIN); } else if (driver.menu_ctx && driver.menu_ctx->backend) return menu_action_setting_set(type, label, action); return 0; }
int menu_shader_manager_setting_toggle( unsigned id, const char *label, unsigned action) { if (!driver.menu) { RARCH_ERR("Cannot toggle shader setting, menu handle is not initialized.\n"); return 0; } #if 0 RARCH_LOG("shader label: %s\n", label); #endif rarch_setting_t *current_setting = NULL; rarch_setting_t *setting_data = (rarch_setting_t *)setting_data_get_list(); if (!strcmp(label, "video_shader_default_filter")) { if ((current_setting = setting_data_find_setting( setting_data, "video_smooth"))) menu_action_setting_boolean(current_setting, action); } else if (id >= MENU_SETTINGS_SHADER_PARAMETER_0 && id <= MENU_SETTINGS_SHADER_PARAMETER_LAST) { bool apply_changes = false; struct gfx_shader *shader = NULL; struct gfx_shader_parameter *param = NULL; if (!(shader = (struct gfx_shader*)driver.menu->parameter_shader)) return 0; if (!(param = &shader->parameters[id - MENU_SETTINGS_SHADER_PARAMETER_0])) return 0; switch (action) { case MENU_ACTION_START: param->current = param->initial; apply_changes = true; break; case MENU_ACTION_LEFT: param->current -= param->step; apply_changes = true; break; case MENU_ACTION_RIGHT: param->current += param->step; apply_changes = true; break; default: break; } param->current = min(max(param->minimum, param->current), param->maximum); if (apply_changes && !strcmp(label, "video_shader_parameters")) rarch_main_command(RARCH_CMD_SHADERS_APPLY_CHANGES); } else if ((!strcmp(label, "video_shader_parameters") || !strcmp(label, "video_shader_preset_parameters")) && action == MENU_ACTION_OK) menu_entries_push(driver.menu->menu_stack, "", "video_shader_parameters", MENU_FILE_SWITCH, driver.menu->selection_ptr); else if (!strcmp(label, "shader_apply_changes") || !strcmp(label, "video_shader_num_passes")) { if (!strcmp(label, "video_shader_num_passes")) return handle_shader_pass_setting(driver.menu->shader, action); menu_action_setting_set(id, label, action); } else if (!strcmp(label, "video_shader_preset")) { switch (action) { case MENU_ACTION_OK: menu_entries_push(driver.menu->menu_stack, g_settings.video.shader_dir, "video_shader_preset", id, driver.menu->selection_ptr); break; case MENU_ACTION_START: break; default: break; } } else if (!strcmp(label, "video_shader_pass")) { hack_shader_pass = id - MENU_SETTINGS_SHADER_PASS_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = NULL; if (shader) shader_pass = (struct gfx_shader_pass*)&shader->pass[hack_shader_pass]; switch (action) { case MENU_ACTION_OK: menu_entries_push(driver.menu->menu_stack, g_settings.video.shader_dir, "video_shader_pass", id, driver.menu->selection_ptr); break; case MENU_ACTION_START: if (shader_pass) *shader_pass->source.path = '\0'; break; default: break; } } else if (!strcmp(label, "video_shader_filter_pass")) { unsigned pass = id - MENU_SETTINGS_SHADER_PASS_FILTER_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = (struct gfx_shader_pass*) &shader->pass[pass]; switch (action) { case MENU_ACTION_START: if (shader) shader->pass[pass].filter = RARCH_FILTER_UNSPEC; break; case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: case MENU_ACTION_OK: { unsigned delta = (action == MENU_ACTION_LEFT) ? 2 : 1; if (shader_pass) shader_pass->filter = ((shader_pass->filter + delta) % 3); break; } default: break; } } else if (!strcmp(label, "video_shader_scale_pass")) { unsigned pass = id - MENU_SETTINGS_SHADER_PASS_SCALE_0; struct gfx_shader *shader = (struct gfx_shader*)driver.menu->shader; struct gfx_shader_pass *shader_pass = (struct gfx_shader_pass*) &shader->pass[pass]; switch (action) { case MENU_ACTION_START: if (shader) { shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = 0; shader_pass->fbo.valid = false; } break; case MENU_ACTION_LEFT: case MENU_ACTION_RIGHT: case MENU_ACTION_OK: { unsigned current_scale = shader_pass->fbo.scale_x; unsigned delta = action == MENU_ACTION_LEFT ? 5 : 1; current_scale = (current_scale + delta) % 6; if (shader_pass) { shader_pass->fbo.valid = current_scale; shader_pass->fbo.scale_x = shader_pass->fbo.scale_y = current_scale; } break; } default: break; } } return 0; }