static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) { /* Avoid hitting malloc on every single regular quad draw. */ GLfloat short_buffer[4 * (2 + 2 + 4 + 2)]; GLfloat *buffer; struct glsl_attrib attribs[4]; size_t attribs_size = 0, size = 0; struct glsl_attrib *attr = NULL; const struct shader_uniforms *uni = NULL; glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; if (!glsl || !glsl->shader->modern || !coords) 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); 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); 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); if (buffer != short_buffer) free(buffer); return true; fallback: if (coords) gl_ff_vertex(coords); return false; }
static bool gl_glsl_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) { GLfloat short_buffer[4 * (2 + 2 + 4 + 2)]; struct glsl_attrib attribs[4]; size_t attribs_size = 0; size_t size = 0; GLfloat *buffer = short_buffer; glsl_shader_data_t *glsl = (glsl_shader_data_t*)shader_data; const struct shader_uniforms *uni = glsl ? &glsl->uniforms[glsl->active_idx] : NULL; if (!glsl || !glsl->shader->modern || !coords) { if (coords) return false; return true; } if (coords->vertices > 4) { /* Avoid hitting malloc on every single regular quad draw. */ size_t elems = 0; elems += (uni->color >= 0) * 4; elems += (uni->tex_coord >= 0) * 2; elems += (uni->vertex_coord >= 0) * 2; elems += (uni->lut_tex_coord >= 0) * 2; elems *= coords->vertices * sizeof(GLfloat); buffer = (GLfloat*)malloc(elems); } if (!buffer) return false; if (uni->tex_coord >= 0) { gl_glsl_set_coord_array(attribs, uni->tex_coord, coords->tex_coord, coords, size, 2); attribs_size++; } if (uni->vertex_coord >= 0) { gl_glsl_set_coord_array(attribs, uni->vertex_coord, coords->vertex, coords, size, 2); attribs_size++; } if (uni->color >= 0) { gl_glsl_set_coord_array(attribs, uni->color, coords->color, coords, size, 4); attribs_size++; } if (uni->lut_tex_coord >= 0) { gl_glsl_set_coord_array(attribs, uni->lut_tex_coord, coords->lut_tex_coord, coords, size, 2); attribs_size++; } 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); if (buffer != short_buffer) free(buffer); return true; }