Document and refactor menu_shader.c

This commit is contained in:
twinaphex 2015-01-10 05:53:41 +01:00
parent ef720d3815
commit b2c03ccbfb
3 changed files with 119 additions and 55 deletions

View File

@ -182,7 +182,7 @@ static void content_list_push(void *data, core_info_t *info, const char* path)
for (j = 0; j < num_items; j++) for (j = 0; j < num_items; j++)
{ {
if (list->elems[j].attr.i == RARCH_DIRECTORY) // is a directory if (list->elems[j].attr.i == RARCH_DIRECTORY)
content_list_push(flist, info, list->elems[j].data); content_list_push(flist, info, list->elems[j].data);
else else
menu_list_push( menu_list_push(

View File

@ -18,11 +18,16 @@
#include "menu_entries.h" #include "menu_entries.h"
#include <file/file_path.h> #include <file/file_path.h>
#ifdef HAVE_SHADER_MANAGER
/**
* menu_shader_manager_init:
*
* Initializes shader manager.
**/
void menu_shader_manager_init(void *data) void menu_shader_manager_init(void *data)
{ {
char cgp_path[PATH_MAX_LENGTH]; #ifdef HAVE_SHADER_MANAGER
char preset_path[PATH_MAX_LENGTH];
const char *ext; const char *ext;
struct gfx_shader *shader = NULL; struct gfx_shader *shader = NULL;
config_file_t *conf = NULL; config_file_t *conf = NULL;
@ -84,69 +89,92 @@ void menu_shader_manager_init(void *data)
const char *shader_dir = *g_settings.video.shader_dir ? const char *shader_dir = *g_settings.video.shader_dir ?
g_settings.video.shader_dir : g_settings.system_directory; g_settings.video.shader_dir : g_settings.system_directory;
fill_pathname_join(cgp_path, shader_dir, "menu.glslp", sizeof(cgp_path)); fill_pathname_join(preset_path, shader_dir, "menu.glslp", sizeof(preset_path));
conf = config_file_new(cgp_path); conf = config_file_new(preset_path);
if (!conf) if (!conf)
{ {
fill_pathname_join(cgp_path, shader_dir, "menu.cgp", sizeof(cgp_path)); fill_pathname_join(preset_path, shader_dir, "menu.cgp", sizeof(preset_path));
conf = config_file_new(cgp_path); conf = config_file_new(preset_path);
} }
if (conf) if (conf)
{ {
if (gfx_shader_read_conf_cgp(conf, shader)) if (gfx_shader_read_conf_cgp(conf, shader))
{ {
gfx_shader_resolve_relative(shader, cgp_path); gfx_shader_resolve_relative(shader, preset_path);
gfx_shader_resolve_parameters(conf, shader); gfx_shader_resolve_parameters(conf, shader);
} }
config_file_free(conf); config_file_free(conf);
} }
} }
#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 gfx_shader *shader, void menu_shader_manager_set_preset(struct gfx_shader *shader,
unsigned type, const char *cgp_path) unsigned type, const char *preset_path)
{ {
RARCH_LOG("Setting Menu shader: %s.\n", cgp_path ? cgp_path : "N/A (stock)"); #ifdef HAVE_SHADER_MANAGER
RARCH_LOG("Setting Menu shader: %s.\n", preset_path ? preset_path : "N/A (stock)");
g_settings.video.shader_enable = false; g_settings.video.shader_enable = false;
if (driver.video->set_shader && driver.video->set_shader(driver.video_data, if (driver.video->set_shader && driver.video->set_shader(driver.video_data,
(enum rarch_shader_type)type, cgp_path)) (enum rarch_shader_type)type, preset_path))
{ {
/* Makes sure that we use Menu CGP shader on driver reinit. config_file_t *conf = NULL;
/* Makes sure that we use Menu Preset shader on driver reinit.
* Only do this when the cgp actually works to avoid potential errors. */ * Only do this when the cgp actually works to avoid potential errors. */
strlcpy(g_settings.video.shader_path, cgp_path ? cgp_path : "", strlcpy(g_settings.video.shader_path, preset_path ? preset_path : "",
sizeof(g_settings.video.shader_path)); sizeof(g_settings.video.shader_path));
g_settings.video.shader_enable = true; g_settings.video.shader_enable = true;
if (cgp_path && shader) 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)
{ {
/* Load stored CGP into menu on success. if (gfx_shader_read_conf_cgp(conf, shader))
* Used when a preset is directly loaded.
* No point in updating when the CGP was
* created from the menu itself. */
config_file_t *conf = config_file_new(cgp_path);
if (conf)
{ {
if (gfx_shader_read_conf_cgp(conf, shader)) gfx_shader_resolve_relative(shader, preset_path);
{ gfx_shader_resolve_parameters(conf, shader);
gfx_shader_resolve_relative(shader, cgp_path);
gfx_shader_resolve_parameters(conf, shader);
}
config_file_free(conf);
} }
config_file_free(conf);
driver.menu->need_refresh = true;
} }
driver.menu->need_refresh = true;
} }
#endif
} }
/**
* menu_shader_manager_save_preset:
* @basename : basename of preset
* @apply : immediately set preset after saving
*
* Save a shader preset to disk.
**/
void menu_shader_manager_save_preset( void menu_shader_manager_save_preset(
const char *basename, bool apply) const char *basename, bool apply)
{ {
char buffer[PATH_MAX_LENGTH], config_directory[PATH_MAX_LENGTH], cgp_path[PATH_MAX_LENGTH]; #ifdef HAVE_SHADER_MANAGER
char buffer[PATH_MAX_LENGTH], config_directory[PATH_MAX_LENGTH], preset_path[PATH_MAX_LENGTH];
unsigned d, type = RARCH_SHADER_NONE; unsigned d, type = RARCH_SHADER_NONE;
config_file_t *conf = NULL; config_file_t *conf = NULL;
bool ret = false; bool ret = false;
@ -203,26 +231,38 @@ void menu_shader_manager_save_preset(
if (!*dirs[d]) if (!*dirs[d])
continue; continue;
fill_pathname_join(cgp_path, dirs[d], buffer, sizeof(cgp_path)); fill_pathname_join(preset_path, dirs[d], buffer, sizeof(preset_path));
if (config_file_write(conf, cgp_path)) if (config_file_write(conf, preset_path))
{ {
RARCH_LOG("Saved shader preset to %s.\n", cgp_path); RARCH_LOG("Saved shader preset to %s.\n", preset_path);
if (apply) if (apply)
menu_shader_manager_set_preset(NULL, type, cgp_path); menu_shader_manager_set_preset(NULL, type, preset_path);
ret = true; ret = true;
break; break;
} }
else else
RARCH_LOG("Failed writing shader preset to %s.\n", cgp_path); RARCH_LOG("Failed writing shader preset to %s.\n", preset_path);
} }
config_file_free(conf); config_file_free(conf);
if (!ret) if (!ret)
RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n"); RARCH_ERR("Failed to save shader preset. Make sure config directory and/or shader dir are writable.\n");
#endif
} }
/**
* menu_shader_manager_get_type:
* @shader : shader handle
*
* Gets type of shader.
*
* Returns: type of shader.
**/
unsigned menu_shader_manager_get_type(const struct gfx_shader *shader) unsigned menu_shader_manager_get_type(const struct gfx_shader *shader)
{ {
#ifndef HAVE_SHADER_MANAGER
return RARCH_SHADER_NONE;
#else
/* All shader types must be the same, or we cannot use it. */ /* All shader types must be the same, or we cannot use it. */
unsigned i = 0, type = 0; unsigned i = 0, type = 0;
@ -250,10 +290,17 @@ unsigned menu_shader_manager_get_type(const struct gfx_shader *shader)
} }
return type; return type;
#endif
} }
/**
* menu_shader_manager_apply_changes:
*
* Apply shader state changes.
**/
void menu_shader_manager_apply_changes(void) void menu_shader_manager_apply_changes(void)
{ {
#ifdef HAVE_SHADER_MANAGER
unsigned shader_type = menu_shader_manager_get_type(driver.menu->shader); unsigned shader_type = menu_shader_manager_get_type(driver.menu->shader);
if (driver.menu->shader->passes if (driver.menu->shader->passes
@ -277,22 +324,5 @@ void menu_shader_manager_apply_changes(void)
#endif #endif
} }
menu_shader_manager_set_preset(NULL, shader_type, NULL); menu_shader_manager_set_preset(NULL, shader_type, NULL);
}
#else
void menu_shader_manager_init(void *data) {}
void menu_shader_manager_set_preset(struct gfx_shader *shader,
unsigned type, const char *cgp_path) { }
void menu_shader_manager_save_preset(
const char *basename, bool apply) { }
unsigned menu_shader_manager_get_type(const struct gfx_shader *shader)
{
return RARCH_SHADER_NONE;
}
void menu_shader_manager_apply_changes(void) { }
#endif #endif
}

View File

@ -23,17 +23,51 @@
extern "C" { extern "C" {
#endif #endif
/**
* menu_shader_manager_init:
*
* Initializes shader manager.
**/
void menu_shader_manager_init(void *data); void menu_shader_manager_init(void *data);
void menu_shader_manager_set_preset(struct gfx_shader *shader, /**
unsigned type, const char *cgp_path); * 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 gfx_shader *shader,
unsigned type, const char *preset_path);
/**
* menu_shader_manager_save_preset:
* @basename : basename of preset
* @apply : immediately set preset after saving
*
* Save a shader preset to disk.
**/
void menu_shader_manager_save_preset( void menu_shader_manager_save_preset(
const char *basename, bool apply); const char *basename, bool apply);
/**
* menu_shader_manager_get_type:
* @shader : shader handle
*
* Gets type of shader.
*
* Returns: type of shader.
**/
unsigned menu_shader_manager_get_type( unsigned menu_shader_manager_get_type(
const struct gfx_shader *shader); const struct gfx_shader *shader);
/**
* menu_shader_manager_apply_changes:
*
* Apply shader state changes.
**/
void menu_shader_manager_apply_changes(void); void menu_shader_manager_apply_changes(void);
#ifdef __cplusplus #ifdef __cplusplus