// 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 LinkProgram(p Program) { defer func() { errstr := errDrain() log.Printf("gl.LinkProgram(%v) %v", p, errstr) }() C.glLinkProgram(p.c()) }
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 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 LinkProgram(p Program) { C.glLinkProgram(p.c()) }
func LinkProgram( program uint32) { C.glLinkProgram( C.GLuint(program)) }
// Link links a program object. func (p Program) Link() { C.glLinkProgram(C.GLuint(p)) }