diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 9b957d4a87..f6b34d11b5 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -656,6 +656,7 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) { int i; unsigned width, height; + video_shader_ctx_scale_t scaler; struct gfx_fbo_scale scale, scale_last; if (!gl || video_shader_driver_num_shaders() == 0) @@ -663,8 +664,15 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) video_driver_get_size(&width, &height); - video_shader_driver_scale(1, &scale); - video_shader_driver_scale(video_shader_driver_num_shaders(), &scale_last); + scaler.idx = 1; + scaler.scale = &scale; + + video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); + + scaler.idx = video_shader_driver_num_shaders(); + scaler.scale = &scale_last; + + video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); /* we always want FBO to be at least initialized on startup for consoles */ if (video_shader_driver_num_shaders() == 1 && !scale.valid) @@ -692,7 +700,10 @@ static void gl_init_fbo(gl_t *gl, unsigned fbo_width, unsigned fbo_height) for (i = 1; i < gl->fbo_pass; i++) { - video_shader_driver_scale(i + 1, &gl->fbo_scale[i]); + scaler.idx = i + 1; + scaler.scale = &gl->fbo_scale[i]; + + video_shader_driver_ctl(SHADER_CTL_SCALE, &scaler); if (!gl->fbo_scale[i].valid) { diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index a2b2570fa0..292c6940a4 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -69,17 +69,6 @@ struct video_shader *video_shader_driver_get_current_shader(void) return video_poke->get_current_shader(video_driver); } -void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale) -{ - if (!scale || !current_shader) - return; - - scale->valid = false; - - if (current_shader->shader_scale) - current_shader->shader_scale(shader_data, idx, scale); -} - void video_shader_driver_use(void *data, unsigned index) { if (!current_shader) @@ -222,6 +211,20 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat return current_shader->set_coords(coords->handle_data, shader_data, coords->data); } + case SHADER_CTL_SCALE: + { + video_shader_ctx_scale_t *scaler = (video_shader_ctx_scale_t*)data; + if (!scaler || !scaler->scale) + return false; + + scaler->scale->valid = false; + + if (!current_shader || !current_shader->shader_scale) + return false; + + current_shader->shader_scale(shader_data, scaler->idx, scaler->scale); + } + break; case SHADER_CTL_NONE: default: break; diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index eabbe090c1..3b1f02524e 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -63,7 +63,8 @@ enum video_shader_driver_ctl_state SHADER_CTL_SET_PARAMS, SHADER_CTL_GET_FEEDBACK_PASS, SHADER_CTL_MIPMAP_INPUT, - SHADER_CTL_SET_COORDS + SHADER_CTL_SET_COORDS, + SHADER_CTL_SCALE }; typedef struct shader_backend @@ -132,13 +133,17 @@ typedef struct video_shader_ctx_coords const void *data; } video_shader_ctx_coords_t; +typedef struct video_shader_ctx_scale +{ + unsigned idx; + struct gfx_fbo_scale *scale; +} video_shader_ctx_scale_t; + extern const shader_backend_t gl_glsl_backend; extern const shader_backend_t hlsl_backend; extern const shader_backend_t gl_cg_backend; extern const shader_backend_t shader_null_backend; -void video_shader_driver_scale(unsigned idx, struct gfx_fbo_scale *scale); - /** * shader_ctx_find_driver: * @ident : Identifier of shader context driver to find.