From ea63453f9f3716951c69cfb8456ac060332b8214 Mon Sep 17 00:00:00 2001
From: faiface <faiface@ksp.sk>
Date: Sat, 3 Dec 2016 00:52:23 +0100
Subject: [PATCH] fix and improve code in NewShader

---
 pixelgl/shader.go | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/pixelgl/shader.go b/pixelgl/shader.go
index a168ecb..2b24ebd 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
 			}
 
-- 
GitLab