diff --git a/pixelgl/shader.go b/pixelgl/shader.go index a168ecbacecc69a5c43fa957f3614be6d6cbc09b..2b24ebd8da022380856c568d5fbe5b28e735a016 100644 --- a/pixelgl/shader.go +++ b/pixelgl/shader.go @@ -58,6 +58,8 @@ func NewShader(parent Doer, vertexFormat VertexFormat, uniformFormat UniformForm gl.GetShaderInfoLog(vshader, int32(len(infoLog)), nil, &infoLog[0]) return fmt.Errorf("error compiling vertex shader: %s", string(infoLog)) } + + defer gl.DeleteShader(vshader) } // fragment shader @@ -78,6 +80,8 @@ func NewShader(parent Doer, vertexFormat VertexFormat, uniformFormat UniformForm gl.GetShaderInfoLog(fshader, int32(len(infoLog)), nil, &infoLog[0]) return fmt.Errorf("error compiling fragment shader: %s", string(infoLog)) } + + defer gl.DeleteShader(fshader) } // shader program @@ -98,15 +102,17 @@ func NewShader(parent Doer, vertexFormat VertexFormat, uniformFormat UniformForm } } - gl.DeleteShader(vshader) - gl.DeleteShader(fshader) - // uniforms for uname, utype := range uniformFormat { ulocation := gl.GetUniformLocation(shader.program, gl.Str(uname+"\x00")) if ulocation == -1 { + gl.DeleteProgram(shader.program) return fmt.Errorf("shader does not contain uniform '%s'", uname) } + if _, ok := shader.uniforms[utype]; ok { + gl.DeleteProgram(shader.program) + return fmt.Errorf("failed to create shader: invalid uniform format: duplicate uniform attribute") + } shader.uniforms[utype] = ulocation }