| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Go Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style | |
| 3 // license that can be found in the LICENSE file. | |
| 4 | |
| 5 // Package glutil implements OpenGL utility functions. | |
| 6 package glutil // import "golang.org/x/mobile/gl/glutil" | |
| 7 | |
| 8 import ( | |
| 9 "fmt" | |
| 10 | |
| 11 "golang.org/x/mobile/gl" | |
| 12 ) | |
| 13 | |
| 14 // CreateProgram creates, compiles, and links a gl.Program. | |
| 15 func CreateProgram(vertexSrc, fragmentSrc string) (gl.Program, error) { | |
| 16 program := gl.CreateProgram() | |
| 17 if program.Value == 0 { | |
| 18 return gl.Program{}, fmt.Errorf("glutil: no programs available") | |
| 19 } | |
| 20 | |
| 21 vertexShader, err := loadShader(gl.VERTEX_SHADER, vertexSrc) | |
| 22 if err != nil { | |
| 23 return gl.Program{}, err | |
| 24 } | |
| 25 fragmentShader, err := loadShader(gl.FRAGMENT_SHADER, fragmentSrc) | |
| 26 if err != nil { | |
| 27 gl.DeleteShader(vertexShader) | |
| 28 return gl.Program{}, err | |
| 29 } | |
| 30 | |
| 31 gl.AttachShader(program, vertexShader) | |
| 32 gl.AttachShader(program, fragmentShader) | |
| 33 gl.LinkProgram(program) | |
| 34 | |
| 35 // Flag shaders for deletion when program is unlinked. | |
| 36 gl.DeleteShader(vertexShader) | |
| 37 gl.DeleteShader(fragmentShader) | |
| 38 | |
| 39 if gl.GetProgrami(program, gl.LINK_STATUS) == 0 { | |
| 40 defer gl.DeleteProgram(program) | |
| 41 return gl.Program{}, fmt.Errorf("glutil: %s", gl.GetProgramInfoL
og(program)) | |
| 42 } | |
| 43 return program, nil | |
| 44 } | |
| 45 | |
| 46 func loadShader(shaderType gl.Enum, src string) (gl.Shader, error) { | |
| 47 shader := gl.CreateShader(shaderType) | |
| 48 if shader.Value == 0 { | |
| 49 return gl.Shader{}, fmt.Errorf("glutil: could not create shader
(type %v)", shaderType) | |
| 50 } | |
| 51 gl.ShaderSource(shader, src) | |
| 52 gl.CompileShader(shader) | |
| 53 if gl.GetShaderi(shader, gl.COMPILE_STATUS) == 0 { | |
| 54 defer gl.DeleteShader(shader) | |
| 55 return gl.Shader{}, fmt.Errorf("shader compile: %s", gl.GetShade
rInfoLog(shader)) | |
| 56 } | |
| 57 return shader, nil | |
| 58 } | |
| OLD | NEW |