github.com/SkycoinProject/gomobile@v0.0.0-20190312151609-d3739f865fa6/exp/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 // +build darwin linux windows 6 7 package glutil // import "golang.org/x/mobile/exp/gl/glutil" 8 9 import ( 10 "fmt" 11 12 "golang.org/x/mobile/exp/f32" 13 "golang.org/x/mobile/gl" 14 ) 15 16 // CreateProgram creates, compiles, and links a gl.Program. 17 func CreateProgram(glctx gl.Context, vertexSrc, fragmentSrc string) (gl.Program, error) { 18 program := glctx.CreateProgram() 19 if program.Value == 0 { 20 return gl.Program{}, fmt.Errorf("glutil: no programs available") 21 } 22 23 vertexShader, err := loadShader(glctx, gl.VERTEX_SHADER, vertexSrc) 24 if err != nil { 25 return gl.Program{}, err 26 } 27 fragmentShader, err := loadShader(glctx, gl.FRAGMENT_SHADER, fragmentSrc) 28 if err != nil { 29 glctx.DeleteShader(vertexShader) 30 return gl.Program{}, err 31 } 32 33 glctx.AttachShader(program, vertexShader) 34 glctx.AttachShader(program, fragmentShader) 35 glctx.LinkProgram(program) 36 37 // Flag shaders for deletion when program is unlinked. 38 glctx.DeleteShader(vertexShader) 39 glctx.DeleteShader(fragmentShader) 40 41 if glctx.GetProgrami(program, gl.LINK_STATUS) == 0 { 42 defer glctx.DeleteProgram(program) 43 return gl.Program{}, fmt.Errorf("glutil: %s", glctx.GetProgramInfoLog(program)) 44 } 45 return program, nil 46 } 47 48 func loadShader(glctx gl.Context, shaderType gl.Enum, src string) (gl.Shader, error) { 49 shader := glctx.CreateShader(shaderType) 50 if shader.Value == 0 { 51 return gl.Shader{}, fmt.Errorf("glutil: could not create shader (type %v)", shaderType) 52 } 53 glctx.ShaderSource(shader, src) 54 glctx.CompileShader(shader) 55 if glctx.GetShaderi(shader, gl.COMPILE_STATUS) == 0 { 56 defer glctx.DeleteShader(shader) 57 return gl.Shader{}, fmt.Errorf("shader compile: %s", glctx.GetShaderInfoLog(shader)) 58 } 59 return shader, nil 60 } 61 62 // writeAffine writes the contents of an Affine to a 3x3 matrix GL uniform. 63 func writeAffine(glctx gl.Context, u gl.Uniform, a *f32.Affine) { 64 var m [9]float32 65 m[0*3+0] = a[0][0] 66 m[0*3+1] = a[1][0] 67 m[0*3+2] = 0 68 m[1*3+0] = a[0][1] 69 m[1*3+1] = a[1][1] 70 m[1*3+2] = 0 71 m[2*3+0] = a[0][2] 72 m[2*3+1] = a[1][2] 73 m[2*3+2] = 1 74 glctx.UniformMatrix3fv(u, m[:]) 75 }