func (program *Program) Link() { C.glLinkProgram(program.id) status := C.GLint(0) C.glGetProgramiv(program.id, C.GL_LINK_STATUS, &status) if status != C.GL_TRUE { loglen := C.GLint(0) C.glGetProgramiv(program.id, C.GL_INFO_LOG_LENGTH, &loglen) log := (*C.GLchar)(C.malloc(C.size_t(loglen))) defer C.free(unsafe.Pointer(log)) C.glGetProgramInfoLog(program.id, C.GLsizei(loglen), nil, log) panic(fmt.Errorf("Failed to link shader: %s", C.GoString((*C.char)(log)))) } }
func GetProgramiv( program uint32, pname Enum, params *int32) { C.glGetProgramiv( C.GLuint(program), C.GLenum(pname), (*C.GLint)(params)) }
func (program Program) GetAttachedShaders() []Object { var len C.GLint C.glGetProgramiv(C.GLuint(program), C.GLenum(ACTIVE_UNIFORM_MAX_LENGTH), &len) objects := make([]Object, len) C.glGetAttachedShaders(C.GLuint(program), C.GLsizei(len), nil, *((**C.GLuint)(unsafe.Pointer(&objects)))) return objects }
func GetProgrami(p Program, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetProgrami(%v, %v) %v%v", p, pname, r0, errstr) }() var params C.GLint C.glGetProgramiv(p.c(), pname.c(), ¶ms) return int(params) }
func (program *Program) Shaders() []Shader { if !program.shadersValid { nshaders := C.GLint(0) C.glGetProgramiv(program.id, C.GL_ATTACHED_SHADERS, &nshaders) program.shaders = make([]Shader, nshaders) C.glGetAttachedShaders(program.id, C.GLsizei(nshaders), nil, (*C.GLuint)(&program.shaders[0])) program.shadersValid = true } return program.shaders }
// Link links the attached shader objects func (p *Program) Link() error { var val, val2 C.GLint C.glLinkProgram(p.i) C.glGetProgramiv(p.i, LINK_STATUS, &val) if val != TRUE { C.glGetProgramiv(p.i, INFO_LOG_LENGTH, &val) buf := make([]C.GLchar, val+1) C.glGetProgramInfoLog(p.i, C.GLsizei(val), nil, &buf[0]) return errors.New(C.GoString((*C.char)(&buf[0]))) } p.attr = make(map[string]C.GLuint) C.glGetProgramiv(p.i, ACTIVE_ATTRIBUTES, &val) C.glGetProgramiv(p.i, ACTIVE_ATTRIBUTE_MAX_LENGTH, &val2) buf := make([]C.char, val2) for i := C.GLuint(0); i < C.GLuint(val); i++ { C.glGetActiveAttrib(p.i, i, C.GLsizei(val2), nil, nil, nil, (*C.GLchar)(&buf[0])) p.attr[C.GoString(&buf[0])] = C.GLuint(C.glGetAttribLocation(p.i, (*C.GLchar)(&buf[0]))) } p.uni = make(map[string]C.GLint) C.glGetProgramiv(p.i, ACTIVE_UNIFORMS, &val) C.glGetProgramiv(p.i, ACTIVE_UNIFORM_MAX_LENGTH, &val2) buf = make([]C.char, val2) for i := C.GLuint(0); i < C.GLuint(val); i++ { C.glGetActiveUniform(p.i, i, C.GLsizei(val2), nil, nil, nil, (*C.GLchar)(&buf[0])) p.uni[C.GoString(&buf[0])] = C.glGetUniformLocation(p.i, (*C.GLchar)(&buf[0])) } return nil }
func GetProgramInfoLog(program C.GLuint) string { var logLen C.GLint C.glGetProgramiv(program, 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.glGetProgramInfoLog(C.GLuint(program), C.GLsizei(logLen), (*C.GLsizei)(unsafe.Pointer(nil)), (*C.GLchar)(log)) return string(C.GoBytes(log, C.int(logLenBytes))) }
func (program Program) GetInfoLog() string { var length C.GLint C.glGetProgramiv(C.GLuint(program), 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.glGetProgramInfoLog(C.GLuint(program), C.GLsizei(length), nil, (*C.GLchar)(log)) return C.GoString((*C.char)(log)) } return "" }
func createProgram(vertShaderSrc string, fragShaderSrc string) C.GLuint { vertShader := loadShader(C.GL_VERTEX_SHADER, vertShaderSrc) fragShader := loadShader(C.GL_FRAGMENT_SHADER, fragShaderSrc) prog := C.glCreateProgram() if prog == 0 { panic("Failed to create shader program") } C.glAttachShader(prog, vertShader) checkGLError() C.glAttachShader(prog, fragShader) checkGLError() C.glLinkProgram(prog) var linkStatus C.GLint C.glGetProgramiv(prog, C.GL_LINK_STATUS, &linkStatus) if linkStatus != C.GL_TRUE { log := GetProgramInfoLog(prog) panic(fmt.Errorf("Failed to link program: %v", log)) } return prog }
func GetProgrami(p Program, pname Enum) int { var params C.GLint C.glGetProgramiv(p.c(), pname.c(), ¶ms) return int(params) }
// Get returns a parameter from a program object. func (p Program) Get(parm ProgramParameter) int { var vl C.GLint C.glGetProgramiv(C.GLuint(p), C.GLenum(parm), &vl) return int(vl) }
func (program Program) Get(param GLenum) int { var rv C.GLint C.glGetProgramiv(C.GLuint(program), C.GLenum(param), &rv) return int(rv) }
func GetProgramiv(program, pname uint, params []int32) []int32 { C.glGetProgramiv(C.GLuint(program), C.GLenum(pname), (*C.GLint)(unsafe.Pointer(¶ms[0]))) return params }