diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 3cf83ec60d..2d670ad9e6 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -235,6 +235,7 @@ static bool gl_check_fbo_proc(gl_t *gl) static bool gl_shader_init(gl_t *gl) { + video_shader_ctx_init_t init_data; enum rarch_shader_type type; bool ret = false; const shader_backend_t *backend = NULL; @@ -294,12 +295,21 @@ static bool gl_shader_init(gl_t *gl) #endif #endif - ret = video_shader_driver_init(backend, gl, shader_path); + init_data.shader = backend; + init_data.data = gl; + init_data.path = shader_path; + + ret = video_shader_driver_ctl(SHADER_CTL_INIT, &init_data); if (!ret) { RARCH_ERR("[GL]: Failed to initialize shader, falling back to stock.\n"); - ret = video_shader_driver_init(backend, gl, NULL); + + init_data.shader = backend; + init_data.data = gl; + init_data.path = NULL; + + ret = video_shader_driver_ctl(SHADER_CTL_INIT, &init_data); } return ret; @@ -2897,6 +2907,7 @@ static bool gl_set_shader(void *data, enum rarch_shader_type type, const char *path) { #if defined(HAVE_GLSL) || defined(HAVE_CG) + video_shader_ctx_init_t init_data; const shader_backend_t *shader = NULL; gl_t *gl = (gl_t*)data; @@ -2940,9 +2951,15 @@ static bool gl_set_shader(void *data, glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); #endif - if (!video_shader_driver_init(shader, gl, path)) + init_data.shader = shader; + init_data.data = gl; + init_data.path = path; + + if (!video_shader_driver_ctl(SHADER_CTL_INIT, &init_data)) { - video_shader_driver_init(shader, gl, NULL); + init_data.path = NULL; + + video_shader_driver_ctl(SHADER_CTL_INIT, &init_data); RARCH_WARN("[GL]: Failed to set multipass shader. Falling back to stock.\n"); diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 8fb7906365..196ce99a4c 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -80,25 +80,6 @@ void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale) current_shader->shader_scale(shader_data, idx, scale); } -bool video_shader_driver_init(const shader_backend_t *shader, - void *data, const char *path) -{ - void *tmp = NULL; - - if (!shader || !shader->init) - return false; - - tmp = shader->init(data, path); - - if (!tmp) - return false; - - shader_data = tmp; - current_shader = shader; - - return true; -} - void video_shader_driver_use(void *data, unsigned index) { if (!current_shader) @@ -216,6 +197,23 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat } } return false; + case SHADER_CTL_INIT: + { + video_shader_ctx_init_t *init = (video_shader_ctx_init_t*)data; + void *tmp = NULL; + + if (!init->shader || !init->shader->init) + return false; + + tmp = init->shader->init(init->data, init->path); + + if (!tmp) + return false; + + shader_data = tmp; + current_shader = init->shader; + } + break; case SHADER_CTL_GET_FEEDBACK_PASS: if (!current_shader || !current_shader->get_feedback_pass) return false; diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 92db893d64..5f17f74a59 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -34,6 +34,7 @@ enum video_shader_driver_ctl_state { SHADER_CTL_NONE = 0, SHADER_CTL_DEINIT, + SHADER_CTL_INIT, /* Finds first suitable shader context driver. */ SHADER_CTL_INIT_FIRST, SHADER_CTL_SET_PARAMS, @@ -76,6 +77,13 @@ typedef struct shader_backend const char *ident; } shader_backend_t; +typedef struct video_shader_ctx_init +{ + const shader_backend_t *shader; + void *data; + const char *path; +} video_shader_ctx_init_t; + typedef struct video_shader_ctx_params { void *data; @@ -136,8 +144,6 @@ const shader_backend_t *shader_ctx_find_driver(const char *ident); struct video_shader *video_shader_driver_get_current_shader(void); -bool video_shader_driver_init(const shader_backend_t *shader, - void *data, const char *path); void video_shader_driver_use(void *data, unsigned index);