From b0e014adc6717054696a3d031004a4b2596d8317 Mon Sep 17 00:00:00 2001 From: Themaister Date: Fri, 23 May 2014 12:23:08 +0200 Subject: [PATCH] Expose currently selected shader via poke interface. --- driver.h | 2 ++ gfx/gl.c | 9 +++++++++ gfx/shader_cg.c | 6 ++++++ gfx/shader_common.h | 2 ++ gfx/shader_glsl.c | 6 ++++++ gfx/shader_hlsl.c | 6 ++++++ gfx/video_thread_wrapper.c | 13 +++++++++++++ 7 files changed, 44 insertions(+) diff --git a/driver.h b/driver.h index 7492c3cb51..f26335c5d1 100644 --- a/driver.h +++ b/driver.h @@ -358,6 +358,8 @@ typedef struct video_poke_interface void (*show_mouse)(void *data, bool state); void (*grab_mouse_toggle)(void *data); + + struct gfx_shader *(*get_current_shader)(void *data); } video_poke_interface_t; typedef struct video_driver diff --git a/gfx/gl.c b/gfx/gl.c index c8450ecf94..b5cd72cb8a 100644 --- a/gfx/gl.c +++ b/gfx/gl.c @@ -2909,6 +2909,12 @@ static void gl_show_mouse(void *data, bool state) gl->ctx_driver->show_mouse(gl, state); } +static struct gfx_shader *gl_get_current_shader(void *data) +{ + gl_t *gl = (gl_t*)data; + return gl->shader ? gl->shader->get_current_shader() : NULL; +} + static const video_poke_interface_t gl_poke_interface = { NULL, #ifdef HAVE_FBO @@ -2924,6 +2930,9 @@ static const video_poke_interface_t gl_poke_interface = { gl_set_osd_msg, gl_show_mouse, + NULL, + + gl_get_current_shader, }; static void gl_get_poke_interface(void *data, const video_poke_interface_t **iface) diff --git a/gfx/shader_cg.c b/gfx/shader_cg.c index e21fa14549..46ee003639 100644 --- a/gfx/shader_cg.c +++ b/gfx/shader_cg.c @@ -913,6 +913,11 @@ static bool gl_cg_mipmap_input(unsigned index) return false; } +static struct gfx_shader *gl_cg_get_current_shader(void) +{ + return cg_active ? cg_shader : NULL; +} + void gl_cg_invalidate_context(void) { cgCtx = NULL; @@ -931,6 +936,7 @@ const gl_shader_backend_t gl_cg_backend = { gl_cg_set_mvp, gl_cg_get_prev_textures, gl_cg_mipmap_input, + gl_cg_get_current_shader, RARCH_SHADER_CG, }; diff --git a/gfx/shader_common.h b/gfx/shader_common.h index 15e59ea1cc..d33713ff6d 100644 --- a/gfx/shader_common.h +++ b/gfx/shader_common.h @@ -54,6 +54,8 @@ struct gl_shader_backend unsigned (*get_prev_textures)(void); bool (*mipmap_input)(unsigned index); + struct gfx_shader *(*get_current_shader)(void); + enum rarch_shader_type type; }; diff --git a/gfx/shader_glsl.c b/gfx/shader_glsl.c index 92c7fe84aa..6e0d0206c9 100644 --- a/gfx/shader_glsl.c +++ b/gfx/shader_glsl.c @@ -1179,6 +1179,11 @@ static bool gl_glsl_mipmap_input(unsigned index) return false; } +static struct gfx_shader *gl_glsl_get_current_shader(void) +{ + return glsl_enable ? glsl_shader : NULL; +} + void gl_glsl_set_get_proc_address(gfx_ctx_proc_t (*proc)(const char*)) { glsl_get_proc_address = proc; @@ -1204,6 +1209,7 @@ const gl_shader_backend_t gl_glsl_backend = { gl_glsl_set_mvp, gl_glsl_get_prev_textures, gl_glsl_mipmap_input, + gl_glsl_get_current_shader, RARCH_SHADER_GLSL, }; diff --git a/gfx/shader_hlsl.c b/gfx/shader_hlsl.c index 92980e8c09..3cf5d65e96 100644 --- a/gfx/shader_hlsl.c +++ b/gfx/shader_hlsl.c @@ -435,6 +435,11 @@ static bool hlsl_mipmap_input(unsigned index) return false; } +static struct gfx_shader *hlsl_get_current_shader(void) +{ + return NULL; +} + const gl_shader_backend_t hlsl_backend = { hlsl_init, hlsl_deinit, @@ -448,6 +453,7 @@ const gl_shader_backend_t hlsl_backend = { hlsl_set_mvp, NULL, /* hlsl_get_prev_textures */ hlsl_mipmap_input, + hlsl_get_current_shader, RARCH_SHADER_HLSL, }; diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index ca8e574516..76f844c483 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -751,6 +751,13 @@ static void thread_apply_state_changes(void *data) slock_unlock(thr->frame.lock); } +// This is read-only state which should not have any kind of race condition. +static struct gfx_shader *thread_get_current_shader(void *data) +{ + thread_video_t *thr = (thread_video_t*)data; + return thr->poke ? thr->poke->get_current_shader(thr->driver_data) : NULL; +} + static const video_poke_interface_t thread_poke = { thread_set_filtering, #ifdef HAVE_FBO @@ -763,6 +770,12 @@ static const video_poke_interface_t thread_poke = { thread_set_texture_frame, thread_set_texture_enable, #endif + + NULL, + NULL, + NULL, + + thread_get_current_shader, }; static void thread_get_poke_interface(void *data, const video_poke_interface_t **iface)