diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 004415a68c..ed694fd727 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -217,6 +217,7 @@ static void gl_overlay_tex_geom(void *data, static void gl_render_overlay(gl_t *gl, video_frame_info_t *video_info) { + video_shader_ctx_coords_t coords; unsigned i; unsigned width = video_info->width; unsigned height = video_info->height; @@ -238,8 +239,10 @@ static void gl_render_overlay(gl_t *gl, video_frame_info_t *video_info) gl->coords.color = gl->overlay_color_coord; gl->coords.vertices = 4 * gl->overlays; - video_info->cb_shader_set_coords(NULL, video_info->shader_data, - (const struct video_coords*)&gl->coords); + coords.handle_data = NULL; + coords.data = &gl->coords; + + video_shader_driver_set_coords(coords); video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); @@ -994,6 +997,7 @@ static void gl_pbo_async_readback(gl_t *gl) static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) { + video_shader_ctx_coords_t coords; GLfloat color[16]; unsigned width = video_info->width; unsigned height = video_info->height; @@ -1015,6 +1019,9 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) color[14] = 1.0f; color[15] = gl->menu_texture_alpha; + if (!gl->menu_texture) + return; + gl->coords.vertex = vertexes_flipped; gl->coords.tex_coord = tex_coords; gl->coords.color = color; @@ -1024,8 +1031,10 @@ static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) gl->coords.vertices = 4; - video_info->cb_shader_set_coords(NULL, video_info->shader_data, - (const struct video_coords*)&gl->coords); + coords.handle_data = NULL; + coords.data = &gl->coords; + + video_shader_driver_set_coords(coords); video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp_no_rot); @@ -1055,6 +1064,7 @@ static bool gl_frame(void *data, const void *frame, unsigned pitch, const char *msg, video_frame_info_t *video_info) { + video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; struct video_tex_info feedback_info; gl_t *gl = (gl_t*)data; @@ -1206,9 +1216,10 @@ static bool gl_frame(void *data, const void *frame, video_shader_driver_set_parameters(params); gl->coords.vertices = 4; + coords.handle_data = NULL; + coords.data = &gl->coords; - video_info->cb_shader_set_coords(NULL, video_info->shader_data, - (const struct video_coords*)&gl->coords); + video_shader_driver_set_coords(coords); video_info->cb_shader_set_mvp(gl, video_info->shader_data, &gl->mvp); @@ -1228,7 +1239,7 @@ static bool gl_frame(void *data, const void *frame, { menu_driver_frame(video_info); - if (gl->menu_texture_enable && gl->menu_texture) + if (gl->menu_texture_enable) gl_draw_texture(gl, video_info); } #endif diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 40e2a59acf..754e08b4e2 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -296,6 +296,12 @@ static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct return true; } +static bool gl_cg_set_coords_fallback(void *handle_data, void *shader_data, const struct video_coords *coords) +{ + gl_ff_vertex(coords); + return true; +} + static void gl_cg_set_texture_info( cg_shader_data_t *cg, const struct cg_fbo_params *params, @@ -1227,6 +1233,7 @@ const shader_backend_t gl_cg_backend = { gl_cg_wrap_type, gl_cg_shader_scale, gl_cg_set_coords, + gl_cg_set_coords_fallback, gl_cg_set_mvp, gl_cg_get_prev_textures, gl_cg_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 0cfe262771..a76359eeb6 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1488,6 +1488,13 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, return true; } +static bool gl_glsl_set_coords_fallback(void *handle_data, void *shader_data, + const struct video_coords *coords) +{ + gl_ff_vertex(coords); + return true; +} + static void gl_glsl_use(void *data, void *shader_data, unsigned idx, bool set_active) { GLuint id; @@ -1614,6 +1621,7 @@ const shader_backend_t gl_glsl_backend = { gl_glsl_wrap_type, gl_glsl_shader_scale, gl_glsl_set_coords, + gl_glsl_set_coords_fallback, gl_glsl_set_mvp, gl_glsl_get_prev_textures, gl_glsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_hlsl.c b/gfx/drivers_shader/shader_hlsl.c index faae099665..a26e3e4fce 100644 --- a/gfx/drivers_shader/shader_hlsl.c +++ b/gfx/drivers_shader/shader_hlsl.c @@ -539,6 +539,7 @@ const shader_backend_t hlsl_backend = { NULL, /* hlsl_wrap_type */ hlsl_shader_scale, NULL, /* hlsl_set_coords */ + NULL, /* hlsl_set_coords_fallback */ hlsl_set_mvp, NULL, /* hlsl_get_prev_textures */ hlsl_get_feedback_pass, diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index 8ee92bff40..8a2ce6c77f 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -88,6 +88,7 @@ const shader_backend_t shader_null_backend = { NULL, NULL, NULL, + NULL, shader_null_get_prev_textures, NULL, NULL, diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 8d4a85ec37..101e85c538 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -121,12 +121,8 @@ typedef struct video_pixel_scaler void *scaler_out; } video_pixel_scaler_t; -static void (*video_driver_cb_shader_use)(void *data, - void *shader_data, unsigned index, bool set_active); -static bool (*video_driver_cb_shader_set_mvp)(void *data, - void *shader_data, const math_matrix_4x4 *mat); -static bool (*video_driver_cb_shader_set_coords)(void *handle_data, - void *shader_data, const struct video_coords *coords); +static void (*video_driver_cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); +static bool (*video_driver_cb_shader_set_mvp)(void *data, void *shader_data, const math_matrix_4x4 *mat); /* Opaque handles to currently running window. * Used by e.g. input drivers which bind to a window. @@ -2521,7 +2517,6 @@ void video_driver_build_info(video_frame_info_t *video_info) video_info->cb_shader_use = video_driver_cb_shader_use; video_info->cb_shader_set_mvp = video_driver_cb_shader_set_mvp; - video_info->cb_shader_set_coords = video_driver_cb_shader_set_coords; #ifdef HAVE_THREADS video_driver_threaded_unlock(is_threaded); @@ -3202,15 +3197,8 @@ static void video_shader_driver_reset_to_defaults(void) current_shader->set_mvp = video_shader_driver_set_mvp_null; video_driver_cb_shader_set_mvp = video_shader_driver_set_mvp_null; } - if (current_shader->set_coords) - { - video_driver_cb_shader_set_coords = current_shader->set_coords; - } - else - { + if (!current_shader->set_coords) current_shader->set_coords = video_shader_driver_set_coords_null; - video_driver_cb_shader_set_coords = video_shader_driver_set_coords_null; - } if (current_shader->use) video_driver_cb_shader_use = current_shader->use; else diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 0fcce825f8..d2dd72cd4b 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -219,6 +219,8 @@ typedef struct shader_backend unsigned index, struct gfx_fbo_scale *scale); bool (*set_coords)(void *handle_data, void *shader_data, const struct video_coords *coords); + bool (*set_coords_fallback)(void *handle_data, + void *shader_data, const struct video_coords *coords); bool (*set_mvp)(void *data, void *shader_data, const math_matrix_4x4 *mat); unsigned (*get_prev_textures)(void *data); @@ -451,8 +453,6 @@ typedef struct video_frame_info void (*cb_shader_use)(void *data, void *shader_data, unsigned index, bool set_active); bool (*cb_shader_set_mvp)(void *data, void *shader_data, const math_matrix_4x4 *mat); - bool (*cb_shader_set_coords)(void *handle_data, - void *shader_data, const struct video_coords *coords); void *context_data; void *shader_data; @@ -1223,7 +1223,9 @@ bool video_shader_driver_get_feedback_pass(unsigned *data); bool video_shader_driver_mipmap_input(unsigned *index); -#define video_shader_driver_set_coords(coords) current_shader->set_coords(coords.handle_data, shader_data, (const struct video_coords*)coords.data) +#define video_shader_driver_set_coords(coords) \ + 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);