Move code from retroarch.c to video_shader_parse.c

This commit is contained in:
twinaphex 2021-09-11 18:15:35 +02:00
parent f09be107c6
commit 2490f6e215
4 changed files with 284 additions and 258 deletions

View File

@ -29,13 +29,20 @@
#include <lrc_hash.h>
#include <string/stdstring.h>
#include <streams/file_stream.h>
#include <lists/dir_list.h>
#include <lists/string_list.h>
#ifdef HAVE_MENU
#include "../menu/menu_driver.h"
#include "../menu/menu_shader.h"
#endif
#include "../configuration.h"
#include "../verbosity.h"
#include "../frontend/frontend_driver.h"
#include "../command.h"
#include "../file_path_special.h"
#include "../paths.h"
#include "../retroarch.h"
#include "video_shader_parse.h"
@ -1968,3 +1975,239 @@ bool video_shader_check_for_changes(void)
return frontend_driver_check_for_path_changes(file_change_data);
}
void dir_free_shader(
struct rarch_dir_shader_list *dir_list,
bool shader_remember_last_dir)
{
if (dir_list->shader_list)
{
dir_list_free(dir_list->shader_list);
dir_list->shader_list = NULL;
}
if (dir_list->directory)
{
free(dir_list->directory);
dir_list->directory = NULL;
}
dir_list->selection = 0;
dir_list->shader_loaded = false;
dir_list->remember_last_preset_dir = shader_remember_last_dir;
}
void dir_init_shader(
void *menu_driver_data_,
settings_t *settings,
struct rarch_dir_shader_list *dir_list)
{
bool show_hidden_files = settings->bools.show_hidden_files;
bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *directory_video_shader = settings->paths.directory_video_shader;
const char *directory_menu_config = settings->paths.directory_menu_config;
bool video_shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *last_shader_preset_dir = NULL;
const char *last_shader_preset_file_name = NULL;
#if defined(HAVE_MENU)
menu_handle_t *menu = (menu_handle_t*)menu_driver_data_;
enum rarch_shader_type last_shader_preset_type = menu ? menu->last_shader_selection.preset_type : RARCH_SHADER_NONE;
menu_driver_get_last_shader_preset_path(
&last_shader_preset_dir, &last_shader_preset_file_name);
#else
enum rarch_shader_type last_shader_preset_type = RARCH_SHADER_NONE;
#endif
/* Always free existing shader list */
dir_free_shader(dir_list,
video_shader_remember_last_dir);
/* Try directory of last selected shader preset */
if (shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
!string_is_empty(last_shader_preset_dir) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
last_shader_preset_dir,
last_shader_preset_file_name,
show_hidden_files))
return;
/* Try video shaders directory */
if (!string_is_empty(directory_video_shader) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
directory_video_shader, NULL, show_hidden_files))
return;
/* Try config directory */
if (!string_is_empty(directory_menu_config) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
directory_menu_config, NULL, show_hidden_files))
return;
/* Try 'top level' directory containing main
* RetroArch config file */
if (!path_is_empty(RARCH_PATH_CONFIG))
{
char *rarch_config_directory = strdup(path_get(RARCH_PATH_CONFIG));
path_basedir(rarch_config_directory);
if (!string_is_empty(rarch_config_directory))
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
rarch_config_directory, NULL, show_hidden_files);
free(rarch_config_directory);
}
}
void dir_check_shader(
void *menu_driver_data_,
settings_t *settings,
struct rarch_dir_shader_list *dir_list,
bool pressed_next,
bool pressed_prev)
{
bool video_shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *last_shader_preset_dir = NULL;
const char *last_shader_preset_file_name = NULL;
const char *set_shader_path = NULL;
bool dir_list_initialised = false;
#if defined(HAVE_MENU)
void *menu_ptr = menu_driver_data_;
menu_handle_t *menu = (menu_handle_t*)menu_ptr;
enum rarch_shader_type last_shader_preset_type = menu ? menu->last_shader_selection.preset_type : RARCH_SHADER_NONE;
menu_driver_get_last_shader_preset_path(
&last_shader_preset_dir, &last_shader_preset_file_name);
#else
void *menu_ptr = NULL;
enum rarch_shader_type last_shader_preset_type = RARCH_SHADER_NONE;
#endif
/* Check whether shader list needs to be
* (re)initialised */
if (!dir_list->shader_list ||
(dir_list->remember_last_preset_dir != video_shader_remember_last_dir) ||
(video_shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
!string_is_equal(dir_list->directory, last_shader_preset_dir)))
{
dir_init_shader(menu_ptr, settings, dir_list);
dir_list_initialised = true;
}
if (!dir_list->shader_list ||
(dir_list->shader_list->size < 1))
return;
/* Check whether a 'last used' shader file
* name is provided
* > Note: We can end up calling
* string_is_equal(dir_list->directory, last_shader_preset_dir)
* twice. This is wasteful, but we cannot safely cache
* the first result since dir_init_shader() is called
* in-between the two invocations... */
if (video_shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
string_is_equal(dir_list->directory, last_shader_preset_dir) &&
!string_is_empty(last_shader_preset_file_name))
{
/* Ensure that we start with a dir_list selection
* index matching the last used shader */
if (!dir_list_initialised)
{
const char *current_file_path = NULL;
const char *current_file_name = NULL;
if (dir_list->selection < dir_list->shader_list->size)
current_file_path = dir_list->shader_list->elems[dir_list->selection].data;
if (!string_is_empty(current_file_path))
current_file_name = path_basename(current_file_path);
if (!string_is_empty(current_file_name) &&
!string_is_equal(current_file_name, last_shader_preset_file_name))
{
size_t i;
for (i = 0; i < dir_list->shader_list->size; i++)
{
const char *file_path = dir_list->shader_list->elems[i].data;
const char *file_name = NULL;
if (string_is_empty(file_path))
continue;
file_name = path_basename(file_path);
if (string_is_empty(file_name))
continue;
if (string_is_equal(file_name, last_shader_preset_file_name))
{
dir_list->selection = i;
break;
}
}
}
}
/* Check whether the shader referenced by the
* current selection index is already loaded */
if (!dir_list->shader_loaded)
{
struct video_shader *shader = menu_shader_get();
if (shader && !string_is_empty(shader->loaded_preset_path))
{
char last_shader_path[PATH_MAX_LENGTH];
last_shader_path[0] = '\0';
fill_pathname_join(last_shader_path,
last_shader_preset_dir, last_shader_preset_file_name,
sizeof(last_shader_path));
if (string_is_equal(last_shader_path, shader->loaded_preset_path))
dir_list->shader_loaded = true;
}
}
}
/* Select next shader in list */
if (pressed_next)
{
/* Only increment selection if a shader
* from this list has already been loaded
* (otherwise first entry in the list may
* be skipped) */
if (dir_list->shader_loaded)
{
if (dir_list->selection < dir_list->shader_list->size - 1)
dir_list->selection++;
else
dir_list->selection = 0;
}
}
/* Select previous shader in list */
else if (pressed_prev)
{
if (dir_list->selection > 0)
dir_list->selection--;
else
dir_list->selection = dir_list->shader_list->size - 1;
}
else
return;
set_shader_path = dir_list->shader_list->elems[dir_list->selection].data;
#if defined(HAVE_MENU)
menu_driver_set_last_shader_preset_path(set_shader_path);
#endif
command_set_shader(NULL, set_shader_path);
dir_list->shader_loaded = true;
}

View File

@ -22,6 +22,9 @@
#include <retro_miscellaneous.h>
#include <file/config_file.h>
#include <file/file_path.h>
#include <lists/string_list.h>
#include "../configuration.h"
RETRO_BEGIN_DECLS
@ -102,6 +105,15 @@ struct video_shader_parameter
char desc[64];
};
struct rarch_dir_shader_list
{
struct string_list *shader_list;
char *directory;
size_t selection;
bool shader_loaded;
bool remember_last_preset_dir;
};
struct video_shader_pass
{
struct gfx_fbo_scale fbo; /* unsigned alignment */
@ -236,6 +248,33 @@ bool video_shader_check_for_changes(void);
const char *video_shader_type_to_str(enum rarch_shader_type type);
void dir_free_shader(
struct rarch_dir_shader_list *dir_list,
bool shader_remember_last_dir);
void dir_init_shader(
void *menu_driver_data_,
settings_t *settings,
struct rarch_dir_shader_list *dir_list);
/**
* dir_check_shader:
* @pressed_next : Was next shader key pressed?
* @pressed_prev : 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.
**/
void dir_check_shader(
void *menu_driver_data_,
settings_t *settings,
struct rarch_dir_shader_list *dir_list,
bool pressed_next,
bool pressed_prev);
const char *video_shader_get_preset_extension(enum rarch_shader_type type);
RETRO_END_DECLS

View File

@ -39,15 +39,6 @@ enum auto_shader_operation
AUTO_SHADER_OP_EXISTS
};
struct rarch_dir_shader_list
{
struct string_list *shader_list;
char *directory;
size_t selection;
bool shader_loaded;
bool remember_last_preset_dir;
};
struct video_shader *menu_shader_get(void);
void menu_shader_manager_free(void *data);

View File

@ -7417,253 +7417,6 @@ static void path_deinit_subsystem(struct rarch_state *p_rarch)
p_rarch->subsystem_fullpaths = NULL;
}
static void dir_free_shader(
struct rarch_dir_shader_list *dir_list,
bool shader_remember_last_dir)
{
if (dir_list->shader_list)
{
dir_list_free(dir_list->shader_list);
dir_list->shader_list = NULL;
}
if (dir_list->directory)
{
free(dir_list->directory);
dir_list->directory = NULL;
}
dir_list->selection = 0;
dir_list->shader_loaded = false;
dir_list->remember_last_preset_dir = shader_remember_last_dir;
}
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
static void dir_init_shader(
struct rarch_state *p_rarch,
settings_t *settings,
struct rarch_dir_shader_list *dir_list)
{
bool show_hidden_files = settings->bools.show_hidden_files;
bool shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *directory_video_shader = settings->paths.directory_video_shader;
const char *directory_menu_config = settings->paths.directory_menu_config;
bool video_shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *last_shader_preset_dir = NULL;
const char *last_shader_preset_file_name = NULL;
#if defined(HAVE_MENU)
menu_handle_t *menu = p_rarch->menu_driver_data;
enum rarch_shader_type last_shader_preset_type = menu ? menu->last_shader_selection.preset_type : RARCH_SHADER_NONE;
menu_driver_get_last_shader_preset_path(
&last_shader_preset_dir, &last_shader_preset_file_name);
#else
enum rarch_shader_type last_shader_preset_type = RARCH_SHADER_NONE;
#endif
/* Always free existing shader list */
dir_free_shader(dir_list,
video_shader_remember_last_dir);
/* Try directory of last selected shader preset */
if (shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
!string_is_empty(last_shader_preset_dir) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
last_shader_preset_dir,
last_shader_preset_file_name,
show_hidden_files))
return;
/* Try video shaders directory */
if (!string_is_empty(directory_video_shader) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
directory_video_shader, NULL, show_hidden_files))
return;
/* Try config directory */
if (!string_is_empty(directory_menu_config) &&
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
directory_menu_config, NULL, show_hidden_files))
return;
/* Try 'top level' directory containing main
* RetroArch config file */
if (!path_is_empty(RARCH_PATH_CONFIG))
{
char *rarch_config_directory = strdup(path_get(RARCH_PATH_CONFIG));
path_basedir(rarch_config_directory);
if (!string_is_empty(rarch_config_directory))
dir_init_shader_internal(
video_shader_remember_last_dir,
dir_list,
rarch_config_directory, NULL, show_hidden_files);
free(rarch_config_directory);
}
}
/**
* dir_check_shader:
* @pressed_next : Was next shader key pressed?
* @pressed_prev : 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 dir_check_shader(
struct rarch_state *p_rarch,
settings_t *settings,
struct rarch_dir_shader_list *dir_list,
bool pressed_next,
bool pressed_prev)
{
bool video_shader_remember_last_dir = settings->bools.video_shader_remember_last_dir;
const char *last_shader_preset_dir = NULL;
const char *last_shader_preset_file_name = NULL;
const char *set_shader_path = NULL;
bool dir_list_initialised = false;
#if defined(HAVE_MENU)
menu_handle_t *menu = p_rarch->menu_driver_data;
enum rarch_shader_type last_shader_preset_type = menu ? menu->last_shader_selection.preset_type : RARCH_SHADER_NONE;
menu_driver_get_last_shader_preset_path(
&last_shader_preset_dir, &last_shader_preset_file_name);
#else
enum rarch_shader_type last_shader_preset_type = RARCH_SHADER_NONE;
#endif
/* Check whether shader list needs to be
* (re)initialised */
if (!dir_list->shader_list ||
(dir_list->remember_last_preset_dir != video_shader_remember_last_dir) ||
(video_shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
!string_is_equal(dir_list->directory, last_shader_preset_dir)))
{
dir_init_shader(p_rarch, settings, dir_list);
dir_list_initialised = true;
}
if (!dir_list->shader_list ||
(dir_list->shader_list->size < 1))
return;
/* Check whether a 'last used' shader file
* name is provided
* > Note: We can end up calling
* string_is_equal(dir_list->directory, last_shader_preset_dir)
* twice. This is wasteful, but we cannot safely cache
* the first result since dir_init_shader() is called
* in-between the two invocations... */
if (video_shader_remember_last_dir &&
(last_shader_preset_type != RARCH_SHADER_NONE) &&
string_is_equal(dir_list->directory, last_shader_preset_dir) &&
!string_is_empty(last_shader_preset_file_name))
{
/* Ensure that we start with a dir_list selection
* index matching the last used shader */
if (!dir_list_initialised)
{
const char *current_file_path = NULL;
const char *current_file_name = NULL;
if (dir_list->selection < dir_list->shader_list->size)
current_file_path = dir_list->shader_list->elems[dir_list->selection].data;
if (!string_is_empty(current_file_path))
current_file_name = path_basename(current_file_path);
if (!string_is_empty(current_file_name) &&
!string_is_equal(current_file_name, last_shader_preset_file_name))
{
size_t i;
for (i = 0; i < dir_list->shader_list->size; i++)
{
const char *file_path = dir_list->shader_list->elems[i].data;
const char *file_name = NULL;
if (string_is_empty(file_path))
continue;
file_name = path_basename(file_path);
if (string_is_empty(file_name))
continue;
if (string_is_equal(file_name, last_shader_preset_file_name))
{
dir_list->selection = i;
break;
}
}
}
}
/* Check whether the shader referenced by the
* current selection index is already loaded */
if (!dir_list->shader_loaded)
{
struct video_shader *shader = menu_shader_get();
if (shader && !string_is_empty(shader->loaded_preset_path))
{
char last_shader_path[PATH_MAX_LENGTH];
last_shader_path[0] = '\0';
fill_pathname_join(last_shader_path,
last_shader_preset_dir, last_shader_preset_file_name,
sizeof(last_shader_path));
if (string_is_equal(last_shader_path, shader->loaded_preset_path))
dir_list->shader_loaded = true;
}
}
}
/* Select next shader in list */
if (pressed_next)
{
/* Only increment selection if a shader
* from this list has already been loaded
* (otherwise first entry in the list may
* be skipped) */
if (dir_list->shader_loaded)
{
if (dir_list->selection < dir_list->shader_list->size - 1)
dir_list->selection++;
else
dir_list->selection = 0;
}
}
/* Select previous shader in list */
else if (pressed_prev)
{
if (dir_list->selection > 0)
dir_list->selection--;
else
dir_list->selection = dir_list->shader_list->size - 1;
}
else
return;
set_shader_path = dir_list->shader_list->elems[dir_list->selection].data;
#if defined(HAVE_MENU)
menu_driver_set_last_shader_preset_path(set_shader_path);
#endif
command_set_shader(NULL, set_shader_path);
dir_list->shader_loaded = true;
}
#endif
/* get size functions */
size_t dir_get_size(enum rarch_dir_type type)
@ -10750,12 +10503,12 @@ bool command_event(enum event_command cmd, void *data)
break;
case CMD_EVENT_SHADER_NEXT:
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
dir_check_shader(p_rarch, settings, &p_rarch->dir_shader_list, true, false);
dir_check_shader(p_rarch->menu_driver_data, settings, &p_rarch->dir_shader_list, true, false);
#endif
break;
case CMD_EVENT_SHADER_PREV:
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
dir_check_shader(p_rarch, settings, &p_rarch->dir_shader_list, false, true);
dir_check_shader(p_rarch->menu_driver_data, settings, &p_rarch->dir_shader_list, false, true);
#endif
break;
case CMD_EVENT_BSV_RECORDING_TOGGLE: