From 77a62573a21fb4a787e18335f41c9b110a578913 Mon Sep 17 00:00:00 2001 From: Themaister Date: Thu, 26 Dec 2013 23:34:40 +0100 Subject: [PATCH] Fix crash in GLSL when overlays with many textures are used. Have to call shader->use() for each set_coords or we overflow the attribs array cached buffer. --- gfx/gl.c | 7 ++++--- gfx/shader_glsl.c | 13 +++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/gfx/gl.c b/gfx/gl.c index 91dec027b3..688d417426 100644 --- a/gfx/gl.c +++ b/gfx/gl.c @@ -2522,9 +2522,6 @@ static void gl_render_overlay(void *data) 1.0f, 1.0f, 1.0f, 1.0f, }; - if (gl->shader) - gl->shader->use(GL_SHADER_STOCK_BLEND); - glEnable(GL_BLEND); if (gl->overlay_full_screen) @@ -2532,6 +2529,10 @@ static void gl_render_overlay(void *data) for (i = 0; i < gl->overlays; i++) { + // Ensure that we reset the attrib array. + if (gl->shader) + gl->shader->use(GL_SHADER_STOCK_BLEND); + glBindTexture(GL_TEXTURE_2D, gl->overlay[i].tex); for (j = 0; j < 4; j++) white_color_mod[3 + j * 4] = gl->overlay[i].alpha_mod; diff --git a/gfx/shader_glsl.c b/gfx/shader_glsl.c index 9cb67ab256..7866ce6fc6 100644 --- a/gfx/shader_glsl.c +++ b/gfx/shader_glsl.c @@ -552,11 +552,16 @@ static void gl_glsl_set_attribs(GLuint vbo, GLfloat *buffer, size_t *buffer_elem for (i = 0; i < num_attrs; i++) { GLint loc = attrs[i].loc; - glEnableVertexAttribArray(loc); - gl_attribs[gl_attrib_index++] = loc; - glVertexAttribPointer(loc, attrs[i].size, GL_FLOAT, GL_FALSE, 0, - (const GLvoid*)(uintptr_t)attrs[i].offset); + if (gl_attrib_index < ARRAY_SIZE(gl_attribs)) + { + glEnableVertexAttribArray(loc); + glVertexAttribPointer(loc, attrs[i].size, GL_FLOAT, GL_FALSE, 0, + (const GLvoid*)(uintptr_t)attrs[i].offset); + gl_attribs[gl_attrib_index++] = loc; + } + else + RARCH_WARN("Attrib array buffer was overflown!\n"); } glBindBuffer(GL_ARRAY_BUFFER, 0);