static bool cmd_set_shader(const char *arg) { char msg[PATH_MAX_LENGTH] = {0}; enum rarch_shader_type type = RARCH_SHADER_NONE; const char *ext = path_get_extension(arg); uint32_t ext_hash = msg_hash_calculate(ext); switch (ext_hash) { case COMMAND_EXT_GLSL: case COMMAND_EXT_GLSLP: type = RARCH_SHADER_GLSL; break; case COMMAND_EXT_CG: case COMMAND_EXT_CGP: type = RARCH_SHADER_CG; break; default: return false; } snprintf(msg, sizeof(msg), "Shader: \"%s\"", arg); rarch_main_msg_queue_push(msg, 1, 120, true); RARCH_LOG("%s \"%s\".\n", msg_hash_to_str(MSG_APPLYING_SHADER), arg); return video_driver_set_shader(type, arg); }
/** * check_shader_dir: * @pressed_next : was next shader key pressed? * @pressed_previous : was previous shader key pressed? * * Checks if any one of the shader keys has been pressed for this frame: * a) Next shader index. * b) Previous shader index. * * Will also immediately apply the shader. **/ static void check_shader_dir(rarch_dir_list_t *dir_list, bool pressed_next, bool pressed_prev) { uint32_t ext_hash; char msg[128]; const char *shader = NULL; const char *ext = NULL; enum rarch_shader_type type = RARCH_SHADER_NONE; if (!dir_list || !dir_list->list) return; if (pressed_next) { dir_list->ptr = (dir_list->ptr + 1) % dir_list->list->size; } else if (pressed_prev) { if (dir_list->ptr == 0) dir_list->ptr = dir_list->list->size - 1; else dir_list->ptr--; } else return; shader = dir_list->list->elems[dir_list->ptr].data; ext = path_get_extension(shader); ext_hash = msg_hash_calculate(ext); switch (ext_hash) { case SHADER_EXT_GLSL: case SHADER_EXT_GLSLP: type = RARCH_SHADER_GLSL; break; case SHADER_EXT_CG: case SHADER_EXT_CGP: type = RARCH_SHADER_CG; break; default: return; } snprintf(msg, sizeof(msg), "%s #%u: \"%s\".", msg_hash_to_str(MSG_SHADER), (unsigned)dir_list->ptr, shader); runloop_msg_queue_push(msg, 1, 120, true); RARCH_LOG("%s \"%s\".\n", msg_hash_to_str(MSG_APPLYING_SHADER), shader); if (!video_driver_set_shader(type, shader)) RARCH_WARN("%s\n", msg_hash_to_str(MSG_FAILED_TO_APPLY_SHADER)); }
/** * check_shader_dir: * @pressed_next : was next shader key pressed? * @pressed_previous : was previous shader key pressed? * * Checks if any one of the shader keys has been pressed for this frame: * a) Next shader index. * b) Previous shader index. * * Will also immediately apply the shader. **/ static void check_shader_dir(global_t *global, bool pressed_next, bool pressed_prev) { uint32_t ext_hash; char msg[PATH_MAX_LENGTH] = {0}; const char *shader = NULL; const char *ext = NULL; enum rarch_shader_type type = RARCH_SHADER_NONE; if (!global || !global->shader_dir.list) return; if (pressed_next) { global->shader_dir.ptr = (global->shader_dir.ptr + 1) % global->shader_dir.list->size; } else if (pressed_prev) { if (global->shader_dir.ptr == 0) global->shader_dir.ptr = global->shader_dir.list->size - 1; else global->shader_dir.ptr--; } else return; shader = global->shader_dir.list->elems[global->shader_dir.ptr].data; ext = path_get_extension(shader); ext_hash = msg_hash_calculate(ext); switch (ext_hash) { case SHADER_EXT_GLSL: case SHADER_EXT_GLSLP: type = RARCH_SHADER_GLSL; break; case SHADER_EXT_CG: case SHADER_EXT_CGP: type = RARCH_SHADER_CG; break; default: return; } snprintf(msg, sizeof(msg), "%s #%u: \"%s\".", msg_hash_to_str(MSG_SHADER), (unsigned)global->shader_dir.ptr, shader); rarch_main_msg_queue_push(msg, 1, 120, true); RARCH_LOG("%s \"%s\".\n", msg_hash_to_str(MSG_APPLYING_SHADER), shader); if (!video_driver_set_shader(type, shader)) RARCH_WARN(msg_hash_to_str(MSG_FAILED_TO_APPLY_SHADER)); }
/** * menu_shader_manager_set_preset: * @shader : Shader handle. * @type : Type of shader. * @preset_path : Preset path to load from. * * Sets shader preset. **/ void menu_shader_manager_set_preset(void *data, unsigned type, const char *preset_path) { #ifdef HAVE_SHADER_MANAGER struct video_shader *shader = (struct video_shader*)data; config_file_t *conf = NULL; bool refresh = false; settings_t *settings = config_get_ptr(); if (!video_driver_set_shader((enum rarch_shader_type)type, preset_path)) { configuration_set_bool(settings, settings->bools.video_shader_enable, false); return; } /* Makes sure that we use Menu Preset shader on driver reinit. * Only do this when the cgp actually works to avoid potential errors. */ strlcpy(settings->paths.path_shader, preset_path ? preset_path : "", sizeof(settings->paths.path_shader)); configuration_set_bool(settings, settings->bools.video_shader_enable, true); if (!preset_path || !shader) return; /* Load stored Preset into menu on success. * Used when a preset is directly loaded. * No point in updating when the Preset was * created from the menu itself. */ conf = config_file_new(preset_path); if (!conf) return; RARCH_LOG("Setting Menu shader: %s.\n", preset_path); if (video_shader_read_conf_cgp(conf, shader)) { video_shader_resolve_relative(shader, preset_path); video_shader_resolve_parameters(conf, shader); } config_file_free(conf); menu_entries_ctl(MENU_ENTRIES_CTL_SET_REFRESH, &refresh); #endif }
/** * menu_shader_manager_set_preset: * @shader : Shader handle. * @type : Type of shader. * @preset_path : Preset path to load from. * * Sets shader preset. **/ void menu_shader_manager_set_preset(struct video_shader *shader, unsigned type, const char *preset_path) { #ifdef HAVE_SHADER_MANAGER config_file_t *conf = NULL; settings_t *settings = config_get_ptr(); settings->video.shader_enable = false; if (!video_driver_set_shader((enum rarch_shader_type)type, preset_path)) return; /* Makes sure that we use Menu Preset shader on driver reinit. * Only do this when the cgp actually works to avoid potential errors. */ strlcpy(settings->video.shader_path, preset_path ? preset_path : "", sizeof(settings->video.shader_path)); settings->video.shader_enable = true; if (!preset_path) return; if (!shader) return; /* Load stored Preset into menu on success. * Used when a preset is directly loaded. * No point in updating when the Preset was * created from the menu itself. */ conf = config_file_new(preset_path); if (!conf) return; RARCH_LOG("Setting Menu shader: %s.\n", preset_path ? preset_path : "N/A (stock)"); if (video_shader_read_conf_cgp(conf, shader)) { video_shader_resolve_relative(shader, preset_path); video_shader_resolve_parameters(conf, shader); } config_file_free(conf); menu_entries_set_refresh(false); #endif }
/** * check_shader_dir: * @pressed_next : was next shader key pressed? * @pressed_previous : was previous shader key pressed? * * Checks if any one of the shader keys has been pressed for this frame: * a) Next shader index. * b) Previous shader index. * * Will also immediately apply the shader. **/ static void check_shader_dir(bool pressed_next, bool pressed_prev) { char msg[PATH_MAX_LENGTH]; const char *shader = NULL, *ext = NULL; enum rarch_shader_type type = RARCH_SHADER_NONE; if (!g_extern.shader_dir.list) return; if (pressed_next) { g_extern.shader_dir.ptr = (g_extern.shader_dir.ptr + 1) % g_extern.shader_dir.list->size; } else if (pressed_prev) { if (g_extern.shader_dir.ptr == 0) g_extern.shader_dir.ptr = g_extern.shader_dir.list->size - 1; else g_extern.shader_dir.ptr--; } else return; shader = g_extern.shader_dir.list->elems[g_extern.shader_dir.ptr].data; ext = path_get_extension(shader); if (strcmp(ext, "glsl") == 0 || strcmp(ext, "glslp") == 0) type = RARCH_SHADER_GLSL; else if (strcmp(ext, "cg") == 0 || strcmp(ext, "cgp") == 0) type = RARCH_SHADER_CG; else return; msg_queue_clear(g_extern.msg_queue); snprintf(msg, sizeof(msg), "Shader #%u: \"%s\".", (unsigned)g_extern.shader_dir.ptr, shader); msg_queue_push(g_extern.msg_queue, msg, 1, 120); RARCH_LOG("Applying shader \"%s\".\n", shader); if (!video_driver_set_shader(type, shader)) RARCH_WARN("Failed to apply shader.\n"); }
/** * runloop_check_shader_dir: * @pressed_next : was next shader key pressed? * @pressed_previous : was previous shader key pressed? * * Checks if any one of the shader keys has been pressed for this frame: * a) Next shader index. * b) Previous shader index. * * Will also immediately apply the shader. **/ static void runloop_check_shader_dir(rarch_dir_list_t *dir_list, bool pressed_next, bool pressed_prev) { char msg[128] = {0}; const char *shader = NULL; enum rarch_shader_type type = RARCH_SHADER_NONE; RARCH_LOG("SWITCH \n"); if (!dir_list || !dir_list->list) return; if (pressed_next) { dir_list->ptr = (dir_list->ptr + 1) % dir_list->list->size; } else if (pressed_prev) { if (dir_list->ptr == 0) dir_list->ptr = dir_list->list->size - 1; else dir_list->ptr--; } else return; shader = dir_list->list->elems[dir_list->ptr].data; RARCH_LOG("SWITCH %s,\n", shader); switch (msg_hash_to_file_type(msg_hash_calculate(path_get_extension(shader)))) { case FILE_TYPE_SHADER_GLSL: case FILE_TYPE_SHADER_PRESET_GLSLP: type = RARCH_SHADER_GLSL; break; case FILE_TYPE_SHADER_SLANG: case FILE_TYPE_SHADER_PRESET_SLANGP: type = RARCH_SHADER_SLANG; break; case FILE_TYPE_SHADER_CG: case FILE_TYPE_SHADER_PRESET_CGP: type = RARCH_SHADER_CG; break; default: return; } snprintf(msg, sizeof(msg), "%s #%u: \"%s\".", msg_hash_to_str(MSG_SHADER), (unsigned)dir_list->ptr, shader); runloop_msg_queue_push(msg, 2, 120, true); RARCH_LOG("%s \"%s\".\n", msg_hash_to_str(MSG_APPLYING_SHADER), shader); if (!video_driver_set_shader(type, shader)) RARCH_WARN("%s\n", msg_hash_to_str(MSG_FAILED_TO_APPLY_SHADER)); }