func (shader Shader) Compile() { C.glCompileShader(C.GLuint(shader)) status := C.GLint(0) C.glGetShaderiv(C.GLuint(shader), C.GL_COMPILE_STATUS, &status) if status != C.GL_TRUE { loglen := C.GLint(0) C.glGetShaderiv(C.GLuint(shader), C.GL_INFO_LOG_LENGTH, &loglen) log := (*C.GLchar)(C.malloc(C.size_t(loglen))) defer C.free(unsafe.Pointer(log)) C.glGetShaderInfoLog(C.GLuint(shader), C.GLsizei(loglen), nil, log) panic(fmt.Errorf("Failed to compile %s: %s", shader.Type(), C.GoString((*C.char)(log)))) } }
func GetShaderiv( shader uint32, pname Enum, params *int32) { C.glGetShaderiv( C.GLuint(shader), C.GLenum(pname), (*C.GLint)(params)) }
// NewShader creates a shader object of type typ, loads it with source code src and compiles it func NewShader(typ int, src string) (Shader, error) { var val C.GLint shad := C.glCreateShader(C.GLenum(typ)) s := (*C.GLchar)(C.CString(src)) C.glShaderSource(shad, 1, &s, nil) C.glCompileShader(shad) C.glGetShaderiv(shad, COMPILE_STATUS, &val) if val != TRUE { C.glGetShaderiv(shad, INFO_LOG_LENGTH, &val) buf := make([]C.GLchar, val+1) C.glGetShaderInfoLog(shad, C.GLsizei(val), nil, &buf[0]) C.glDeleteShader(shad) return Shader(0), errors.New(C.GoString((*C.char)(&buf[0]))) } return Shader(shad), nil }
func GetShaderi(s Shader, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetShaderi(%v, %v) %v%v", s, pname, r0, errstr) }() var params C.GLint C.glGetShaderiv(s.c(), pname.c(), ¶ms) return int(params) }
func (shader Shader) GetSource() string { var len C.GLint C.glGetShaderiv(C.GLuint(shader), C.GLenum(SHADER_SOURCE_LENGTH), &len) log := C.malloc(C.size_t(len + 1)) C.glGetShaderSource(C.GLuint(shader), C.GLsizei(len), nil, (*C.GLchar)(log)) defer C.free(log) return C.GoString((*C.char)(log)) }
func (shader Shader) GetInfoLog() string { var length C.GLint C.glGetShaderiv(C.GLuint(shader), C.GLenum(INFO_LOG_LENGTH), &length) // length is buffer size including null character if length > 1 { log := C.malloc(C.size_t(length)) defer C.free(log) C.glGetShaderInfoLog(C.GLuint(shader), C.GLsizei(length), nil, (*C.GLchar)(log)) return C.GoString((*C.char)(log)) } return "" }
func GetShaderInfoLog(shader C.GLuint) string { var logLen C.GLint C.glGetShaderiv(shader, C.GL_INFO_LOG_LENGTH, &logLen) var c C.GLchar logLenBytes := int(logLen) * int(unsafe.Sizeof(c)) log := C.malloc(C.size_t(logLenBytes)) if log == nil { panic("Failed to allocate shader log buffer") } defer C.free(log) C.glGetShaderInfoLog(C.GLuint(shader), C.GLsizei(logLen), (*C.GLsizei)(unsafe.Pointer(nil)), (*C.GLchar)(log)) return string(C.GoBytes(log, C.int(logLenBytes))) }
func loadShader(shaderType C.GLenum, source string) C.GLuint { handle := C.glCreateShader(shaderType) if handle == 0 { panic(fmt.Errorf("Failed to create shader of type %v", shaderType)) } sourceC := C.CString(source) defer C.free(unsafe.Pointer(sourceC)) C.glShaderSource(handle, 1, (**C.GLchar)(unsafe.Pointer(&sourceC)), (*C.GLint)(unsafe.Pointer(nil))) C.glCompileShader(handle) var compiled C.GLint C.glGetShaderiv(handle, C.GL_COMPILE_STATUS, &compiled) if compiled != C.GL_TRUE { log := GetShaderInfoLog(handle) panic(fmt.Errorf("Failed to compile shader: %v, shader: %v", log, source)) } return handle }
func GetShaderi(s Shader, pname Enum) int { var params C.GLint C.glGetShaderiv(s.c(), pname.c(), ¶ms) return int(params) }
func (shader Shader) Get(param GLenum) int { var rv C.GLint C.glGetShaderiv(C.GLuint(shader), C.GLenum(param), &rv) return int(rv) }
func (shader Shader) Type() ShaderType { stype := C.GLint(0) C.glGetShaderiv(C.GLuint(shader), C.GL_SHADER_TYPE, &stype) return ShaderType(stype) }
// Get returns a parameter from a shader object func (s Shader) Get(parm ShaderParameter) int { var vl C.GLint C.glGetShaderiv(C.GLuint(s), C.GLenum(parm), &vl) return int(vl) }
func GetShaderiv(shader, pname uint, params []int32) []int32 { C.glGetShaderiv(C.GLuint(shader), C.GLenum(pname), (*C.GLint)(unsafe.Pointer(¶ms[0]))) return params }