diff --git a/driver.c b/driver.c index b663b1dc22..c1e9f49499 100644 --- a/driver.c +++ b/driver.c @@ -528,7 +528,7 @@ static void init_shader_dir(void) if (!*g_settings.video.shader_dir) return; - g_extern.shader_dir.list = dir_list_new(g_settings.video.shader_dir, "shader", false); + g_extern.shader_dir.list = dir_list_new(g_settings.video.shader_dir, "shader|cg|cgp", false); if (g_extern.shader_dir.list->size == 0) { deinit_shader_dir(); diff --git a/driver.h b/driver.h index 3afc528d47..a6d4d11f42 100644 --- a/driver.h +++ b/driver.h @@ -105,6 +105,14 @@ struct retro_keybind uint32_t joyaxis; }; +enum rarch_shader_type +{ + RARCH_SHADER_CG, + RARCH_SHADER_BSNES, + RARCH_SHADER_AUTO, + RARCH_SHADER_NONE +}; + typedef struct video_info { unsigned width; @@ -177,7 +185,7 @@ typedef struct video_driver // Is the window still active? bool (*alive)(void *data); bool (*focus)(void *data); // Does the window have focus? - bool (*xml_shader)(void *data, const char *path); // Sets XML-shader. Might not be implemented. + bool (*set_shader)(void *data, enum rarch_shader_type type, const char *path); // Sets shader. Might not be implemented. void (*free)(void *data); const char *ident; @@ -281,7 +289,7 @@ extern const input_driver_t input_null; #define video_set_nonblock_state_func(state) driver.video->set_nonblock_state(driver.video_data, state) #define video_alive_func() driver.video->alive(driver.video_data) #define video_focus_func() driver.video->focus(driver.video_data) -#define video_xml_shader_func(path) driver.video->xml_shader(driver.video_data, path) +#define video_set_shader_func(type, path) driver.video->set_shader(driver.video_data, type, path) #define video_set_rotation_func(rotate) driver.video->set_rotation(driver.video_data, rotate) #define video_set_aspect_ratio_func(aspect_idx) driver.video->set_aspect_ratio(driver.video_data, aspect_idx) #define video_viewport_size_func(width, height) driver.video->viewport_size(driver.video_data, width, height) diff --git a/general.h b/general.h index a26e42b276..966fd64364 100644 --- a/general.h +++ b/general.h @@ -73,14 +73,6 @@ #define MAX_PLAYERS 8 -enum rarch_shader_type -{ - RARCH_SHADER_CG, - RARCH_SHADER_BSNES, - RARCH_SHADER_AUTO, - RARCH_SHADER_NONE -}; - // All config related settings go here. struct settings { diff --git a/gfx/gl.c b/gfx/gl.c index 8793009622..4c71f868fe 100644 --- a/gfx/gl.c +++ b/gfx/gl.c @@ -1447,8 +1447,8 @@ static bool gl_focus(void *data) return gfx_ctx_window_has_focus(); } -#ifdef HAVE_XML -static bool gl_xml_shader(void *data, const char *path) +#if defined(HAVE_XML) || defined(HAVE_CG) +static bool gl_set_shader(void *data, enum rarch_shader_type type, const char *path) { gl_t *gl = (gl_t*)data; @@ -1459,8 +1459,26 @@ static bool gl_xml_shader(void *data, const char *path) gl_shader_deinit(); - if (!gl_glsl_init(path)) - return false; + switch (type) + { +#ifdef HAVE_XML + case RARCH_SHADER_BSNES: + if (!gl_glsl_init(path)) + return false; + break; +#endif + +#ifdef HAVE_CG + case RARCH_SHADER_CG: + if (!gl_cg_init(path)) + return false; + break; +#endif + + default: + RARCH_ERR("Invalid shader type in gl_set_shader().\n"); + return false; + } #ifdef HAVE_FBO // Set up render to texture again. @@ -1607,8 +1625,8 @@ const video_driver_t video_gl = { gl_alive, gl_focus, -#ifdef HAVE_XML - gl_xml_shader, +#if defined(HAVE_XML) || defined(HAVE_CG) + gl_set_shader, #else NULL, #endif diff --git a/retroarch.c b/retroarch.c index 48a34b6b57..445c465a2f 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2264,7 +2264,7 @@ static void check_shader_dir(void) static bool old_pressed_next = false; static bool old_pressed_prev = false; - if (!g_extern.shader_dir.list || !driver.video->xml_shader) + if (!g_extern.shader_dir.list || !driver.video->set_shader) return; bool should_apply = false; @@ -2286,18 +2286,29 @@ static void check_shader_dir(void) if (should_apply) { - const char *shader = g_extern.shader_dir.list->elems[g_extern.shader_dir.ptr].data; + const char *shader = g_extern.shader_dir.list->elems[g_extern.shader_dir.ptr].data; + enum rarch_shader_type type = RARCH_SHADER_NONE; - strlcpy(g_settings.video.bsnes_shader_path, shader, sizeof(g_settings.video.bsnes_shader_path)); - g_settings.video.shader_type = RARCH_SHADER_BSNES; + const char *ext = strrchr(shader, '.'); + if (ext) + { + if (strcmp(ext, ".shader") == 0) + type = RARCH_SHADER_BSNES; + else if (strcmp(ext, ".cg") == 0 || strcmp(ext, ".cgp") == 0) + type = RARCH_SHADER_CG; + } + + if (type == RARCH_SHADER_NONE) + return; msg_queue_clear(g_extern.msg_queue); + char msg[512]; - snprintf(msg, sizeof(msg), "XML shader #%u: \"%s\"", (unsigned)g_extern.shader_dir.ptr, shader); + 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_xml_shader_func(shader)) + if (!video_set_shader_func(type, shader)) RARCH_WARN("Failed to apply shader.\n"); } diff --git a/retroarch.cfg b/retroarch.cfg index e32a87d14e..4f799a87c0 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -285,7 +285,7 @@ # input_rate_step_up = kp_plus # input_rate_step_down = kp_minus -# Applies next and previous XML shader in directory. +# Applies next and previous XML/Cg shader in directory. # input_shader_next = m # input_shader_prev = n