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