mirror of
https://github.com/mpv-player/mpv
synced 2025-03-25 04:38:01 +00:00
common, vo_opengl: add/use helper for formatted strings on the stack
Seems like I really like this C99 idiom. No reason not to generalize it do snprintf(). Introduce mp_tprintf(), which basically this idiom to snprintf(). This macro looks like it returns a string that was allocated with alloca() on the caller site, except it's portable C99/C11. (And unlike alloca(), the result is valid only within block scope.) Use it in 2 places in the vo_opengl code. But it has the potential to make a whole bunch of weird looking code look slightly nicer.
This commit is contained in:
parent
3d0f86145c
commit
24dc91907a
@ -287,3 +287,12 @@ char *mp_tag_str_buf(char *buf, size_t buf_size, uint32_t tag)
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
char *mp_tprintf_buf(char *buf, size_t buf_size, const char *format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, format);
|
||||
vsnprintf(buf, buf_size, format, ap);
|
||||
va_end(ap);
|
||||
return buf;
|
||||
}
|
||||
|
@ -101,4 +101,12 @@ char *mp_strerror_buf(char *buf, size_t buf_size, int errnum);
|
||||
char *mp_tag_str_buf(char *buf, size_t buf_size, uint32_t tag);
|
||||
#define mp_tag_str(t) mp_tag_str_buf((char[22]){0}, 22, t)
|
||||
|
||||
// Return a printf(format, ...) formatted string of the given SIZE. SIZE must
|
||||
// be a compile time constant. The result is allocated on the stack and valid
|
||||
// only within the current block scope.
|
||||
#define mp_tprintf(SIZE, format, ...) \
|
||||
mp_tprintf_buf((char[SIZE]){0}, (SIZE), (format), __VA_ARGS__)
|
||||
char *mp_tprintf_buf(char *buf, size_t buf_size, const char *format, ...)
|
||||
PRINTF_ATTRIBUTE(3, 4);
|
||||
|
||||
#endif /* MPLAYER_MPCOMMON_H */
|
||||
|
@ -919,8 +919,7 @@ static GLuint compile_program(struct gl_shader_cache *sc, const char *vertex,
|
||||
compile_attach_shader(sc, prog, GL_VERTEX_SHADER, vertex);
|
||||
compile_attach_shader(sc, prog, GL_FRAGMENT_SHADER, frag);
|
||||
for (int n = 0; sc->vertex_entries[n].name; n++) {
|
||||
char vname[80];
|
||||
snprintf(vname, sizeof(vname), "vertex_%s", sc->vertex_entries[n].name);
|
||||
char *vname = mp_tprintf(80, "vertex_%s", sc->vertex_entries[n].name);
|
||||
gl->BindAttribLocation(prog, n, vname);
|
||||
}
|
||||
link_shader(sc, prog);
|
||||
|
@ -1104,14 +1104,10 @@ static void pass_prepare_src_tex(struct gl_video *p)
|
||||
if (!s->gl_tex)
|
||||
continue;
|
||||
|
||||
char texture_name[32];
|
||||
char texture_size[32];
|
||||
char texture_rot[32];
|
||||
char pixel_size[32];
|
||||
snprintf(texture_name, sizeof(texture_name), "texture%d", n);
|
||||
snprintf(texture_size, sizeof(texture_size), "texture_size%d", n);
|
||||
snprintf(texture_rot, sizeof(texture_rot), "texture_rot%d", n);
|
||||
snprintf(pixel_size, sizeof(pixel_size), "pixel_size%d", n);
|
||||
char *texture_name = mp_tprintf(32, "texture%d", n);
|
||||
char *texture_size = mp_tprintf(32, "texture_size%d", n);
|
||||
char *texture_rot = mp_tprintf(32, "texture_rot%d", n);
|
||||
char *pixel_size = mp_tprintf(32, "pixel_size%d", n);
|
||||
|
||||
if (gl_is_integer_format(s->gl_format)) {
|
||||
gl_sc_uniform_tex_ui(sc, texture_name, s->gl_tex);
|
||||
|
Loading…
Reference in New Issue
Block a user