shl: shader: add "len" parameter to shader sources

Shader sources may not be 0 terminated if we mmap() them. Hence, we need
to pass the length to the shader compiler. As glShaderSource() allows this
<0 as zero-terminated strings, we can simply add a parameter for the
shader length.

Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
This commit is contained in:
David Herrmann 2013-03-15 14:52:05 +01:00
parent 924a732e7c
commit 0a098393c2
4 changed files with 22 additions and 15 deletions

View File

@ -71,7 +71,8 @@ float *gl_m4_stack_tip(struct gl_m4_stack *stack);
struct gl_shader;
int gl_shader_new(struct gl_shader **out, const char *vert, const char *frag,
int gl_shader_new(struct gl_shader **out, const char *vert, int vert_len,
const char *frag, int frag_len,
char **attr, size_t attr_count, llog_submit_t llog,
void *llog_data);
void gl_shader_ref(struct gl_shader *shader);

View File

@ -106,10 +106,10 @@ bool gl_has_error(struct gl_shader *shader)
}
static int compile_shader(struct gl_shader *shader, GLenum type,
const char *source)
const char *source, int len)
{
char msg[512];
GLint status = 1;
GLint status = 1, size;
GLuint s;
s = glCreateShader(type);
@ -118,7 +118,8 @@ static int compile_shader(struct gl_shader *shader, GLenum type,
return GL_NONE;
}
glShaderSource(s, 1, &source, NULL);
size = len;
glShaderSource(s, 1, &source, &size);
glCompileShader(s);
glGetShaderiv(s, GL_COMPILE_STATUS, &status);
@ -132,7 +133,8 @@ static int compile_shader(struct gl_shader *shader, GLenum type,
return s;
}
int gl_shader_new(struct gl_shader **out, const char *vert, const char *frag,
int gl_shader_new(struct gl_shader **out, const char *vert, int vert_len,
const char *frag, int frag_len,
char **attr, size_t attr_count, llog_submit_t llog,
void *llog_data)
{
@ -154,13 +156,15 @@ int gl_shader_new(struct gl_shader **out, const char *vert, const char *frag,
llog_debug(shader, "new shader");
shader->vshader = compile_shader(shader, GL_VERTEX_SHADER, vert);
shader->vshader = compile_shader(shader, GL_VERTEX_SHADER, vert,
vert_len);
if (shader->vshader == GL_NONE) {
ret = -EFAULT;
goto err_free;
}
shader->fshader = compile_shader(shader, GL_FRAGMENT_SHADER, frag);
shader->fshader = compile_shader(shader, GL_FRAGMENT_SHADER, frag,
frag_len);
if (shader->fshader == GL_NONE) {
ret = -EFAULT;
goto err_vshader;

View File

@ -179,8 +179,8 @@ static int gltex_set(struct kmscon_text *txt)
gl_clear_error();
ret = gl_shader_new(&gt->shader, gl_static_gltex_vert,
gl_static_gltex_frag, attr, 4, log_llog, NULL);
ret = gl_shader_new(&gt->shader, gl_static_gltex_vert, -1,
gl_static_gltex_frag, -1, attr, 4, log_llog, NULL);
if (ret)
goto err_bold_htable;

View File

@ -76,16 +76,17 @@ static int init_shaders(struct uterm_video *video)
v3d->sinit = 1;
ret = gl_shader_new(&v3d->fill_shader, gl_static_fill_vert,
gl_static_fill_frag, fill_attr, 2, log_llog, NULL);
ret = gl_shader_new(&v3d->fill_shader, gl_static_fill_vert, -1,
gl_static_fill_frag, -1, fill_attr, 2, log_llog,
NULL);
if (ret)
return ret;
v3d->uni_fill_proj = gl_shader_get_uniform(v3d->fill_shader,
"projection");
ret = gl_shader_new(&v3d->blend_shader, gl_static_blend_vert,
gl_static_blend_frag, blend_attr, 2, log_llog,
ret = gl_shader_new(&v3d->blend_shader, gl_static_blend_vert, -1,
gl_static_blend_frag, -1, blend_attr, 2, log_llog,
NULL);
if (ret)
return ret;
@ -99,8 +100,9 @@ static int init_shaders(struct uterm_video *video)
v3d->uni_blend_bgcol = gl_shader_get_uniform(v3d->blend_shader,
"bgcolor");
ret = gl_shader_new(&v3d->blit_shader, gl_static_blit_vert,
gl_static_blit_frag, blit_attr, 2, log_llog, NULL);
ret = gl_shader_new(&v3d->blit_shader, gl_static_blit_vert, -1,
gl_static_blit_frag, -1, blit_attr, 2, log_llog,
NULL);
if (ret)
return ret;