shl: shader: add "len" parameter to shader sources
authorDavid Herrmann <dh.herrmann@gmail.com>
Fri, 15 Mar 2013 13:52:05 +0000 (14:52 +0100)
committerDavid Herrmann <dh.herrmann@gmail.com>
Sun, 3 Nov 2013 11:12:29 +0000 (12:12 +0100)
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>
src/shl_gl.h
src/shl_gl_shader.c
src/text_gltex.c
src/uterm_drm3d_render.c

index ccff76b..c194433 100644 (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);
index 093d786..68764e8 100644 (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;
index b0abcbd..beb0bba 100644 (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;
 
index c7a213d..698d199 100644 (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;