From 954ac39b91d511507acc6f622a57e5cea6cd91de Mon Sep 17 00:00:00 2001 From: twinaphex Date: Sun, 14 Feb 2016 22:22:40 +0100 Subject: [PATCH] Create SHADER_CTL_GET_PREV_TEXTURES --- gfx/drivers/gl.c | 13 +++++++++++-- gfx/video_shader_driver.c | 26 ++++++++++++++++---------- gfx/video_shader_driver.h | 10 +++++++--- 3 files changed, 34 insertions(+), 15 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index d47c0fdeb9..393a4f6aeb 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -2804,7 +2804,11 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo } { - unsigned minimum = video_shader_driver_get_prev_textures(); + video_shader_ctx_texture_t texture_info; + + video_shader_driver_ctl(SHADER_CTL_GET_PREV_TEXTURES, &texture_info); + + unsigned minimum = texture_info.id; gl->textures = max(minimum + 1, gl->textures); } @@ -3093,7 +3097,12 @@ static bool gl_set_shader(void *data, if (shader) { - unsigned textures = video_shader_driver_get_prev_textures() + 1; + unsigned textures; + video_shader_ctx_texture_t texture_info; + + video_shader_driver_ctl(SHADER_CTL_GET_PREV_TEXTURES, &texture_info); + + textures = texture_info.id + 1; if (textures > gl->textures) /* Have to reinit a bit. */ { diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index f27ea259fb..c71b578300 100644 --- a/gfx/video_shader_driver.c +++ b/gfx/video_shader_driver.c @@ -34,20 +34,26 @@ static const shader_backend_t *shader_ctx_drivers[] = { NULL }; -static const shader_backend_t *current_shader; -static void *shader_data; - -unsigned video_shader_driver_get_prev_textures(void) -{ - if (!current_shader) - return 0; - return current_shader->get_prev_textures(shader_data); -} - bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *data) { + static const shader_backend_t *current_shader = NULL; + static void *shader_data = NULL; + switch (state) { + case SHADER_CTL_GET_PREV_TEXTURES: + { + video_shader_ctx_texture_t *texture = (video_shader_ctx_texture_t*)data; + if (!!texture) + return false; + if (!current_shader) + { + texture->id = 0; + return false; + } + texture->id = current_shader->get_prev_textures(shader_data); + } + break; case SHADER_CTL_GET_IDENT: { video_shader_ctx_ident_t *ident = (video_shader_ctx_ident_t*)data; diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 160653f587..571b1ad396 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -72,7 +72,8 @@ enum video_shader_driver_ctl_state SHADER_CTL_WRAP_TYPE, SHADER_CTL_GET_CURRENT_SHADER, SHADER_CTL_DIRECT_GET_CURRENT_SHADER, - SHADER_CTL_GET_IDENT + SHADER_CTL_GET_IDENT, + SHADER_CTL_GET_PREV_TEXTURES }; typedef struct shader_backend @@ -182,13 +183,16 @@ typedef struct video_shader_ctx_ident const char *ident; } video_shader_ctx_ident_t; +typedef struct video_shader_ctx_texture +{ + unsigned id; +} video_shader_ctx_texture_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; -unsigned video_shader_driver_get_prev_textures(void); - bool video_shader_driver_ctl(enum video_shader_driver_ctl_state state, void *data); #ifdef __cplusplus