diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 649e0ff2b8..3ae35c6b2d 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -1161,14 +1161,17 @@ error: return NULL; } -static void gl_cg_use(void *data, void *shader_data, unsigned idx) +static void gl_cg_use(void *data, void *shader_data, unsigned idx, bool set_active) { cg_shader_data_t *cg_data = (cg_shader_data_t*)shader_data; if (cg_data && cg_data->prg[idx].vprg && cg_data->prg[idx].fprg) { - gl_cg_reset_attrib(cg_data); + if (set_active) + { + gl_cg_reset_attrib(cg_data); + cg_data->active_idx = idx; + } - cg_data->active_idx = idx; cgGLBindProgram(cg_data->prg[idx].vprg); cgGLBindProgram(cg_data->prg[idx].fprg); } diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 1e4ac4e66e..d2064998bd 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1597,7 +1597,7 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const void return true; } -static void gl_glsl_use(void *data, void *shader_data, unsigned idx) +static void gl_glsl_use(void *data, void *shader_data, unsigned idx, bool set_active) { GLuint id; glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; @@ -1607,10 +1607,14 @@ static void gl_glsl_use(void *data, void *shader_data, unsigned idx) if (!glsl) return; - gl_glsl_reset_attrib(glsl); - - glsl->glsl_active_index = idx; - id = glsl->prg[idx].id; + if (set_active) + { + gl_glsl_reset_attrib(glsl); + glsl->glsl_active_index = idx; + id = glsl->prg[idx].id; + } + else + id = idx; glUseProgram(id); } diff --git a/gfx/drivers_shader/shader_hlsl.c b/gfx/drivers_shader/shader_hlsl.c index 904c9d221a..628c257577 100644 --- a/gfx/drivers_shader/shader_hlsl.c +++ b/gfx/drivers_shader/shader_hlsl.c @@ -471,7 +471,7 @@ static void hlsl_deinit(void *data) free(hlsl_data); } -static void hlsl_use(void *data, void *shader_data, unsigned idx) +static void hlsl_use(void *data, void *shader_data, unsigned idx, bool set_active) { d3d_video_t *d3d = (d3d_video_t*)data; hlsl_shader_data_t *hlsl_data = (hlsl_shader_data_t*)shader_data; @@ -479,7 +479,11 @@ static void hlsl_use(void *data, void *shader_data, unsigned idx) if (hlsl_data && hlsl_data->prg[idx].vprg && hlsl_data->prg[idx].fprg) { - hlsl_data->active_idx = idx; + if (set_active) + { + hlsl_data->active_idx = idx; + } + d3d_set_vertex_shader(d3dr, idx, hlsl_data->prg[idx].vprg); #ifdef _XBOX D3DDevice_SetPixelShader(d3dr, hlsl_data->prg[idx].fprg); diff --git a/gfx/drivers_shader/shader_null.c b/gfx/drivers_shader/shader_null.c index afb44cd4ff..77f63f8ec2 100644 --- a/gfx/drivers_shader/shader_null.c +++ b/gfx/drivers_shader/shader_null.c @@ -99,10 +99,11 @@ static bool shader_null_set_coords(void *handle_data, void *shader_data, const v return false; } -static void shader_null_use(void *data, void *shader_data, unsigned idx) +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) diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 4559c6fdd2..85ceb91952 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -228,7 +228,7 @@ bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *dat video_shader_ctx_info_t *shader_info = (video_shader_ctx_info_t*)data; if (!current_shader || !shader_info) return false; - current_shader->use(shader_info->data, shader_data, shader_info->idx); + current_shader->use(shader_info->data, shader_data, shader_info->idx, true); } break; case SHADER_CTL_WRAP_TYPE: diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 601d61b35e..8880b8956b 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -156,7 +156,7 @@ typedef struct shader_backend const void *feedback_info, const void *fbo_info, unsigned fbo_info_cnt); - void (*use)(void *data, void *shader_data, unsigned index); + void (*use)(void *data, void *shader_data, unsigned index, bool set_active); unsigned (*num_shaders)(void *data); bool (*filter_type)(void *data, unsigned index, bool *smooth); enum gfx_wrap_type (*wrap_type)(void *data, unsigned index);