github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/mobile/gl/glutil/glutil.go (about) 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.GetProgramInfoLog(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.GetShaderInfoLog(shader)) 56 } 57 return shader, nil 58 }