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:
parent
924a732e7c
commit
0a098393c2
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -179,8 +179,8 @@ static int gltex_set(struct kmscon_text *txt)
|
||||
|
||||
gl_clear_error();
|
||||
|
||||
ret = gl_shader_new(>->shader, gl_static_gltex_vert,
|
||||
gl_static_gltex_frag, attr, 4, log_llog, NULL);
|
||||
ret = gl_shader_new(>->shader, gl_static_gltex_vert, -1,
|
||||
gl_static_gltex_frag, -1, attr, 4, log_llog, NULL);
|
||||
if (ret)
|
||||
goto err_bold_htable;
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user