From 9d85afd3582629da588e172ebea86ad8b2a5a2b3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 15 Apr 2016 07:37:06 +0200 Subject: [PATCH] Refactor SHADER_CTL_USE --- gfx/d3d/render_chain_xdk.cpp | 1 + gfx/drivers/gl.c | 36 +++++++++++++++----------- gfx/drivers_font/gl_raster_font.c | 5 ++-- gfx/drivers_shader/shader_glsl.c | 12 ++++----- gfx/video_shader_driver.c | 2 +- gfx/video_shader_driver.h | 1 + menu/drivers/zr.c | 1 + menu/drivers/zr_common.c | 18 ++++++++++--- menu/drivers_display/menu_display_gl.c | 1 + 9 files changed, 49 insertions(+), 28 deletions(-) diff --git a/gfx/d3d/render_chain_xdk.cpp b/gfx/d3d/render_chain_xdk.cpp index 1a194da7a4..b562780aaf 100644 --- a/gfx/d3d/render_chain_xdk.cpp +++ b/gfx/d3d/render_chain_xdk.cpp @@ -222,6 +222,7 @@ static void renderchain_set_vertices(void *data, unsigned pass, shader_info.data = d3d; shader_info.idx = pass; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index f06ca3763a..d3791d8ae0 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -1190,8 +1190,9 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, glBindFramebuffer(RARCH_GL_FRAMEBUFFER, gl->fbo[i]); - shader_info.data = gl; - shader_info.idx = i + 1; + shader_info.data = gl; + shader_info.idx = i + 1; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]); @@ -1263,8 +1264,9 @@ static void gl_frame_fbo(gl_t *gl, uint64_t frame_count, /* Render our FBO texture to back buffer. */ gl_bind_backbuffer(); - shader_info.data = gl; - shader_info.idx = gl->fbo_pass + 1; + shader_info.data = gl; + shader_info.idx = gl->fbo_pass + 1; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); @@ -1685,8 +1687,9 @@ static INLINE void gl_set_shader_viewport(gl_t *gl, unsigned idx) video_driver_get_size(&width, &height); - shader_info.data = gl; - shader_info.idx = idx; + shader_info.data = gl; + shader_info.idx = idx; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); gl_set_viewport(gl, width, height, false, true); @@ -1763,8 +1766,9 @@ static INLINE void gl_draw_texture(gl_t *gl) gl->coords.color = color; glBindTexture(GL_TEXTURE_2D, gl->menu_texture); - shader_info.data = gl; - shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.data = gl; + shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); @@ -1833,9 +1837,9 @@ static bool gl_frame(void *data, const void *frame, glBindVertexArray(gl->vao); #endif - - shader_info.data = gl; - shader_info.idx = 1; + shader_info.data = gl; + shader_info.idx = 1; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); @@ -2015,8 +2019,9 @@ static bool gl_frame(void *data, const void *frame, /* Reset state which could easily mess up libretro core. */ if (gl->hw_render_fbo_init) { - shader_info.data = gl; - shader_info.idx = 0; + shader_info.data = gl; + shader_info.idx = 0; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); @@ -3600,8 +3605,9 @@ static void gl_render_overlay(gl_t *gl) glViewport(0, 0, width, height); /* Ensure that we reset the attrib array. */ - shader_info.data = gl; - shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.data = gl; + shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 6bff5193a5..98afa1b789 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -406,8 +406,9 @@ static void gl_raster_font_setup_viewport(gl_raster_t *font, bool full_screen) glBindTexture(GL_TEXTURE_2D, font->tex); - shader_info.data = NULL; - shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.data = NULL; + shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); } diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index d2064998bd..09503686db 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1600,21 +1600,19 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const void 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; - - (void)data; - - if (!glsl) - return; if (set_active) { + glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; + if (!glsl) + return; + gl_glsl_reset_attrib(glsl); glsl->glsl_active_index = idx; id = glsl->prg[idx].id; } else - id = idx; + id = (GLuint)idx; glUseProgram(id); } diff --git a/gfx/video_shader_driver.c b/gfx/video_shader_driver.c index 85ceb91952..71e4b18944 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, true); + current_shader->use(shader_info->data, shader_data, shader_info->idx, shader_info->set_active); } break; case SHADER_CTL_WRAP_TYPE: diff --git a/gfx/video_shader_driver.h b/gfx/video_shader_driver.h index 8880b8956b..400bb91812 100644 --- a/gfx/video_shader_driver.h +++ b/gfx/video_shader_driver.h @@ -216,6 +216,7 @@ typedef struct video_shader_ctx_scale typedef struct video_shader_ctx_info { + bool set_active; unsigned num; unsigned idx; void *data; diff --git a/menu/drivers/zr.c b/menu/drivers/zr.c index d64bec8df7..e8b9583b6a 100644 --- a/menu/drivers/zr.c +++ b/menu/drivers/zr.c @@ -493,6 +493,7 @@ menu_ctx_driver_t menu_ctx_zr = { NULL, NULL, NULL, + NULL, "zahnrad", zrmenu_environ, NULL, diff --git a/menu/drivers/zr_common.c b/menu/drivers/zr_common.c index a1905e2c86..a0516be262 100644 --- a/menu/drivers/zr_common.c +++ b/menu/drivers/zr_common.c @@ -20,6 +20,7 @@ #include "zr_common.h" #include "../menu_display.h" +#include "../../gfx/video_shader_driver.h" struct zr_image zr_common_image_load(const char *filename) { @@ -246,6 +247,7 @@ void zr_common_device_draw(struct zr_device *dev, struct zr_context *ctx, int width, int height, enum zr_anti_aliasing AA) { + video_shader_ctx_info_t shader_info; struct zr_buffer vbuf, ebuf; struct zr_convert_config config; const struct zr_draw_command *cmd = NULL; @@ -276,9 +278,15 @@ void zr_common_device_draw(struct zr_device *dev, #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) glActiveTexture(GL_TEXTURE0); +#endif /* setup program */ - glUseProgram(dev->prog); + shader_info.data = NULL; + shader_info.idx = dev->prog; + shader_info.set_active = false; + video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) glUniformMatrix4fv(dev->uniform_proj, 1, GL_FALSE, &ortho[0][0]); /* convert from command queue into draw list and draw to screen */ @@ -335,9 +343,13 @@ void zr_common_device_draw(struct zr_device *dev, } zr_clear(ctx); -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) /* restore old state */ - glUseProgram((GLuint)last_prog); + shader_info.data = NULL; + shader_info.idx = last_prog; + shader_info.set_active = false; + video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES) glBindTexture(GL_TEXTURE_2D, (GLuint)last_tex); glBindBuffer(GL_ARRAY_BUFFER, (GLuint)last_vbo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, (GLuint)last_ebo); diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 5c87229bda..ca1db23d08 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -84,6 +84,7 @@ static void menu_display_gl_blend_begin(void) shader_info.data = NULL; shader_info.idx = GL_SHADER_STOCK_BLEND; + shader_info.set_active = true; video_shader_driver_ctl(SHADER_CTL_USE, &shader_info); }