diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index ece8419dd6..d90fe8f405 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -27,10 +27,6 @@ #include "../../config.h" #endif -#ifdef HAVE_OPENGL -#include "../common/gl_common.h" -#endif - #include "../video_shader_driver.h" typedef struct null_shader_data @@ -58,18 +54,6 @@ static void *shader_null_init(void *data, const char *path) return null_shader; } -static void shader_null_set_params(void *data, void *shader_data, - unsigned width, unsigned height, - unsigned tex_width, unsigned tex_height, - unsigned out_width, unsigned out_height, - unsigned frame_count, - const void *info, - const void *prev_info, - const void *feedback_info, - const void *fbo_info, unsigned fbo_info_cnt) -{ -} - static void shader_null_set_uniform_parameter( void *data, struct uniform_info *param, @@ -77,35 +61,6 @@ static void shader_null_set_uniform_parameter( { } -static bool shader_null_set_mvp(void *data, void *shader_data, const math_matrix_4x4 *mat) -{ -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_MATRIX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - gl_ff_matrix(mat); -#endif -#endif - return false; -} - -static bool shader_null_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) -{ -#ifdef HAVE_OPENGL -#ifndef NO_GL_FF_VERTEX - if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) - gl_ff_vertex(coords); -#endif -#endif - return false; -} - -static void shader_null_use(void *data, void *shader_data, unsigned idx, bool set_active) -{ - (void)data; - (void)idx; - (void)set_active; -} - static unsigned shader_null_num(void *data) { return 0; @@ -118,12 +73,6 @@ static bool shader_null_filter_type(void *data, unsigned idx, bool *smooth) return false; } -static enum gfx_wrap_type shader_null_wrap_type(void *data, unsigned idx) -{ - (void)idx; - return RARCH_WRAP_BORDER; -} - static void shader_null_shader_scale(void *data, unsigned idx, struct gfx_fbo_scale *scale) { @@ -165,17 +114,17 @@ static bool shader_null_compile_program( const shader_backend_t shader_null_backend = { shader_null_init, shader_null_deinit, - shader_null_set_params, + NULL, shader_null_set_uniform_parameter, shader_null_compile_program, - shader_null_use, + NULL, shader_null_num, shader_null_filter_type, - shader_null_wrap_type, - shader_null_shader_scale, - shader_null_set_coords, NULL, - shader_null_set_mvp, + shader_null_shader_scale, + NULL, + NULL, + NULL, shader_null_get_prev_textures, shader_null_get_feedback_pass, shader_null_mipmap_input, diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index e2422c25b2..2834b46fed 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -16,11 +16,16 @@ #include #include +#include #ifdef HAVE_CONFIG_H #include "../config.h" #endif +#ifdef HAVE_OPENGL +#include "common/gl_common.h" +#endif + #include "video_shader_driver.h" #include "../verbosity.h" @@ -38,7 +43,7 @@ static const shader_backend_t *shader_ctx_drivers[] = { NULL }; -const shader_backend_t *current_shader = NULL; +shader_backend_t *current_shader = NULL; void *shader_data = NULL; static const shader_backend_t *video_shader_set_backend(enum rarch_shader_type type) @@ -135,10 +140,71 @@ bool video_shader_driver_deinit(void) return true; } +static enum gfx_wrap_type video_shader_driver_wrap_type_null(void *data, unsigned index) +{ + return RARCH_WRAP_BORDER; +} + +static bool video_shader_driver_set_mvp_null(void *data, void *shader_data, const math_matrix_4x4 *mat) +{ +#ifdef HAVE_OPENGL +#ifndef NO_GL_FF_MATRIX + if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) + gl_ff_matrix(mat); +#endif +#endif + return false; +} + +static bool video_shader_driver_set_coords_null(void *handle_data, void *shader_data, const struct video_coords *coords) +{ +#ifdef HAVE_OPENGL +#ifndef NO_GL_FF_VERTEX + if (string_is_equal_fast(video_driver_get_ident(), "gl", 2)) + gl_ff_vertex(coords); +#endif +#endif + return false; +} + +static void video_shader_driver_use_null(void *data, void *shader_data, unsigned idx, bool set_active) +{ + (void)data; + (void)idx; + (void)set_active; +} + +static void video_shader_driver_set_params_null(void *data, void *shader_data, + unsigned width, unsigned height, + unsigned tex_width, unsigned tex_height, + unsigned out_width, unsigned out_height, + unsigned frame_count, + const void *info, + const void *prev_info, + const void *feedback_info, + const void *fbo_info, unsigned fbo_info_cnt) +{ +} + +static void video_shader_driver_reset_to_defaults(void) +{ + if (!current_shader->wrap_type) + current_shader->wrap_type = video_shader_driver_wrap_type_null; + if (!current_shader->set_mvp) + current_shader->set_mvp = video_shader_driver_set_mvp_null; + if (!current_shader->set_coords) + current_shader->set_coords = video_shader_driver_set_coords_null; + if (!current_shader->use) + current_shader->use = video_shader_driver_use_null; + if (!current_shader->set_params) + current_shader->set_params = video_shader_driver_set_params_null; +} + /* Finds first suitable shader context driver. */ bool video_shader_driver_init_first(void) { - current_shader = shader_ctx_drivers[0]; + current_shader = (shader_backend_t*)shader_ctx_drivers[0]; + video_shader_driver_reset_to_defaults(); return true; } @@ -160,7 +226,8 @@ bool video_shader_driver_init(video_shader_ctx_init_t *init) return false; shader_data = tmp; - current_shader = init->shader; + current_shader = (shader_backend_t*)init->shader; + video_shader_driver_reset_to_defaults(); return true; } @@ -228,8 +295,6 @@ bool video_shader_driver_compile_program(struct shader_program_info *program_inf bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap) { - if (!current_shader || !current_shader->wrap_type) - return false; wrap->type = current_shader->wrap_type(shader_data, wrap->idx); return true; } diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 0f29f5b83f..5a319cd6a5 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -286,8 +286,7 @@ bool video_shader_driver_deinit(void); current_shader->set_uniform_parameter(shader_data, ¶m, NULL) #define video_shader_driver_set_parameters(params) \ - if (current_shader && current_shader->set_params) \ - current_shader->set_params(params.data, shader_data, params.width, params.height, params.tex_width, params.tex_height, params.out_width, params.out_height, params.frame_counter, params.info, params.prev_info, params.feedback_info, params.fbo_info, params.fbo_info_cnt) + current_shader->set_params(params.data, shader_data, params.width, params.height, params.tex_width, params.tex_height, params.out_width, params.out_height, params.frame_counter, params.info, params.prev_info, params.feedback_info, params.fbo_info, params.fbo_info_cnt) bool video_shader_driver_init_first(void); @@ -298,8 +297,7 @@ bool video_shader_driver_get_feedback_pass(unsigned *data); bool video_shader_driver_mipmap_input(unsigned *index); #define video_shader_driver_set_coords(coords) \ - if (current_shader && current_shader->set_coords) \ - if (!current_shader->set_coords(coords.handle_data, shader_data, (const struct video_coords*)coords.data) && current_shader->set_coords_fallback) \ + if (!current_shader->set_coords(coords.handle_data, shader_data, (const struct video_coords*)coords.data) && current_shader->set_coords_fallback) \ current_shader->set_coords_fallback(coords.handle_data, shader_data, (const struct video_coords*)coords.data) bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler); @@ -307,7 +305,7 @@ bool video_shader_driver_scale(video_shader_ctx_scale_t *scaler); bool video_shader_driver_info(video_shader_ctx_info_t *shader_info); #define video_shader_driver_set_mvp(mvp) \ - if (mvp.matrix && current_shader && current_shader->set_mvp) \ + if (mvp.matrix) \ current_shader->set_mvp(mvp.data, shader_data, mvp.matrix) \ bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter); @@ -315,12 +313,11 @@ bool video_shader_driver_filter_type(video_shader_ctx_filter_t *filter); bool video_shader_driver_compile_program(struct shader_program_info *program_info); #define video_shader_driver_use(shader_info) \ - if (current_shader) \ - current_shader->use(shader_info.data, shader_data, shader_info.idx, shader_info.set_active) + current_shader->use(shader_info.data, shader_data, shader_info.idx, shader_info.set_active) bool video_shader_driver_wrap_type(video_shader_ctx_wrap_t *wrap); -extern const shader_backend_t *current_shader; +extern shader_backend_t *current_shader; extern void *shader_data; extern const shader_backend_t gl_glsl_backend;