diff --git a/gfx/drivers_shader/shader_glsl.c b/gfx/drivers_shader/shader_glsl.c index 203f0c6..6cb5f9a 100644 --- a/gfx/drivers_shader/shader_glsl.c +++ b/gfx/drivers_shader/shader_glsl.c @@ -1330,15 +1330,13 @@ fallback: #define gl_glsl_set_coord_array(attr, coord1, coord2, coords, size, multiplier) \ { \ - unsigned y; \ - attr->loc = coord1; \ - attr->size = multiplier; \ - attr->offset = size * sizeof(GLfloat); \ - attribs_size++; \ - attr++; \ - for (y = 0; y < (multiplier * coords->vertices); y++) \ - buffer[y + size] = coord2[y]; \ - size += multiplier * coords->vertices; \ + attr->loc = coord1; \ + attr->size = multiplier; \ + attr->offset = size * sizeof(GLfloat); \ + attribs_size++; \ + glBufferSubData(GL_ARRAY_BUFFER, attr->offset, multiplier * coords->vertices * sizeof(GLfloat), coord2); \ + size += multiplier * coords->vertices; \ + attr++; \ } static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) @@ -1357,35 +1355,56 @@ static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const struc goto fallback; buffer = short_buffer; - if (coords->vertices > 4) - buffer = (GLfloat*)calloc(coords->vertices * - (2 + 2 + 4 + 2), sizeof(*buffer)); - - if (!buffer) - goto fallback; attr = attribs; uni = &glsl->uniforms[glsl->active_idx]; - if (uni->tex_coord >= 0) - gl_glsl_set_coord_array(attr, uni->tex_coord, coords->tex_coord, coords, size, 2); + glBindBuffer(GL_ARRAY_BUFFER, glsl->vbo[glsl->active_idx].vbo_primary); + { + size_t i; + size_t elems = 0; - if (uni->vertex_coord >= 0) - gl_glsl_set_coord_array(attr, uni->vertex_coord, coords->vertex, coords, size, 2); + elems += (uni->color >= 0) * 4; + elems += (uni->tex_coord >= 0) * 2; + elems += (uni->vertex_coord >= 0) * 2; + elems += (uni->lut_tex_coord >= 0) * 2; - if (uni->color >= 0) - gl_glsl_set_coord_array(attr, uni->color, coords->color, coords, size, 4); + elems *= coords->vertices; - if (uni->lut_tex_coord >= 0) - gl_glsl_set_coord_array(attr, uni->lut_tex_coord, coords->lut_tex_coord, coords, size, 2); + if (elems) { - if (size) - gl_glsl_set_attribs(glsl, - glsl->vbo[glsl->active_idx].vbo_primary, - &glsl->vbo[glsl->active_idx].buffer_primary, - &glsl->vbo[glsl->active_idx].size_primary, - buffer, size, - attribs, attribs_size); + glBufferData(GL_ARRAY_BUFFER, elems * sizeof(GLfloat), NULL, GL_STREAM_DRAW); + + if (uni->tex_coord >= 0) + gl_glsl_set_coord_array(attr, uni->tex_coord, coords->tex_coord, coords, size, 2); + + if (uni->vertex_coord >= 0) + gl_glsl_set_coord_array(attr, uni->vertex_coord, coords->vertex, coords, size, 2); + + if (uni->color >= 0) + gl_glsl_set_coord_array(attr, uni->color, coords->color, coords, size, 4); + + if (uni->lut_tex_coord >= 0) + gl_glsl_set_coord_array(attr, uni->lut_tex_coord, coords->lut_tex_coord, coords, size, 2); + + for (i = 0; i < attribs_size; i++) + { + GLint loc = attribs[i].loc; + + if (glsl->attribs.index < ARRAY_SIZE(glsl->attribs.elems)) + { + glEnableVertexAttribArray(loc); + glVertexAttribPointer(loc, attribs[i].size, GL_FLOAT, GL_FALSE, 0, + (const GLvoid*)(uintptr_t)attribs[i].offset); + glsl->attribs.elems[glsl->attribs.index++] = loc; + } + else + RARCH_WARN("Attrib array buffer was overflown!\n"); + } + } + + } + glBindBuffer(GL_ARRAY_BUFFER, 0); if (buffer != short_buffer) free(buffer);