static bool gl_cg_set_coords(void *handle_data, void *shader_data, const struct video_coords *coords) { cg_shader_data_t *cg = (cg_shader_data_t*)shader_data; if (!cg || !coords) goto fallback; if (cg->prg[cg->active_idx].vertex) gl_cg_set_coord_array(cg->prg[cg->active_idx].vertex, cg, coords->vertex, 2); if (cg->prg[cg->active_idx].tex) gl_cg_set_coord_array(cg->prg[cg->active_idx].tex, cg, coords->tex_coord, 2); if (cg->prg[cg->active_idx].lut_tex) gl_cg_set_coord_array(cg->prg[cg->active_idx].lut_tex, cg, coords->lut_tex_coord, 2); if (cg->prg[cg->active_idx].color) gl_cg_set_coord_array(cg->prg[cg->active_idx].color, cg, coords->color, 4); return true; fallback: gl_ff_vertex(coords); return false; }
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 shader_null_set_coords(void *handle_data, void *shader_data, const void *data) { #ifdef HAVE_OPENGL #ifndef NO_GL_FF_VERTEX if (string_is_equal(video_driver_get_ident(), "gl")) { const struct gfx_coords *coords = (const struct gfx_coords*)data; gl_ff_vertex(coords); } #endif #endif return false; }
static bool shader_null_set_coords(const void *data) { #ifdef HAVE_OPENGL #ifndef NO_GL_FF_VERTEX gl_t *gl = (gl_t*)video_driver_get_ptr(NULL); if (gl) { const struct gfx_coords *coords = (const struct gfx_coords*)data; gl_ff_vertex(coords); } #endif #endif return false; }
static bool gl_cg_set_coords(void *handle_data, void *shader_data, const void *data) { const struct gfx_coords *coords = (const struct gfx_coords*)data; cg_shader_data_t *cg_data = (cg_shader_data_t*)shader_data; if (!cg_data || !coords) goto fallback; SET_COORD(cg_data, vertex, vertex, 2); SET_COORD(cg_data, tex, tex_coord, 2); SET_COORD(cg_data, lut_tex, lut_tex_coord, 2); SET_COORD(cg_data, color, color, 4); return true; fallback: gl_ff_vertex(coords); return false; }
static bool gl_cg_set_coords(const void *data) { const struct gfx_coords *coords = (const struct gfx_coords*)data; driver_t *driver = driver_get_ptr(); cg_shader_data_t *cg = (cg_shader_data_t*)driver->video_shader_data; if (!cg || !coords) goto fallback; SET_COORD(cg, vertex, vertex, 2); SET_COORD(cg, tex, tex_coord, 2); SET_COORD(cg, lut_tex, lut_tex_coord, 2); SET_COORD(cg, color, color, 4); return true; fallback: gl_ff_vertex(coords); return false; }
static bool gl_cg_set_coords(const void *data) { const struct gl_coords *coords = (const struct gl_coords*)data; cg_shader_data_t *cg = (cg_shader_data_t*)driver.video_shader_data; if (!cg || !coords) goto fallback; SET_COORD(cg, vertex, vertex, 2); SET_COORD(cg, tex, tex_coord, 2); SET_COORD(cg, lut_tex, lut_tex_coord, 2); SET_COORD(cg, color, color, 4); return true; fallback: #ifndef NO_GL_FF_VERTEX gl_ff_vertex(coords); #endif return false; }
static bool gl_glsl_set_coords_fallback(void *handle_data, void *shader_data, const struct video_coords *coords) { gl_ff_vertex(coords); return true; }
static bool gl_glsl_set_coords(const void *data) { /* 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; const struct gfx_coords *coords = (const struct gfx_coords*)data; driver_t *driver = driver_get_ptr(); glsl_shader_data_t *glsl = (glsl_shader_data_t*)driver->video_shader_data; if (!glsl || !glsl->shader->modern || !coords) { gl_ff_vertex(coords); return false; } buffer = short_buffer; if (coords->vertices > 4) buffer = (GLfloat*)calloc(coords->vertices * (2 + 2 + 4 + 2), sizeof(*buffer)); if (!buffer) { gl_ff_vertex(coords); return false; } attr = attribs; uni = &glsl->gl_uniforms[glsl->glsl_active_index]; if (uni->tex_coord >= 0) { attr->loc = uni->tex_coord; attr->size = 2; attr->offset = size * sizeof(GLfloat); attribs_size++; attr++; memcpy(buffer + size, coords->tex_coord, 2 * coords->vertices * sizeof(GLfloat)); size += 2 * coords->vertices; } if (uni->vertex_coord >= 0) { attr->loc = uni->vertex_coord; attr->size = 2; attr->offset = size * sizeof(GLfloat); attribs_size++; attr++; memcpy(buffer + size, coords->vertex, 2 * coords->vertices * sizeof(GLfloat)); size += 2 * coords->vertices; } if (uni->color >= 0) { attr->loc = uni->color; attr->size = 4; attr->offset = size * sizeof(GLfloat); attribs_size++; attr++; memcpy(buffer + size, coords->color, 4 * coords->vertices * sizeof(GLfloat)); size += 4 * coords->vertices; } if (uni->lut_tex_coord >= 0) { attr->loc = uni->lut_tex_coord; attr->size = 2; attr->offset = size * sizeof(GLfloat); attribs_size++; attr++; memcpy(buffer + size, coords->lut_tex_coord, 2 * coords->vertices * sizeof(GLfloat)); size += 2 * coords->vertices; } if (size) { gl_glsl_set_attribs(glsl, glsl->glsl_vbo[glsl->glsl_active_index].vbo_primary, &glsl->glsl_vbo[glsl->glsl_active_index].buffer_primary, &glsl->glsl_vbo[glsl->glsl_active_index].size_primary, buffer, size, attribs, attribs_size); } if (buffer != short_buffer) free(buffer); return true; }