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  }