| // Copyright 2012 The go-gl Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package gl |
| |
| // #include "gl.h" |
| // |
| // // Workaround for https://github.com/go-gl/gl/issues/104 |
| // void gogl_glGetShaderSource(GLuint shader, GLsizei bufsize, GLsizei* len, GLchar* source) { |
| // glGetShaderSource(shader, bufsize, len, source); |
| // } |
| // |
| import "C" |
| import "unsafe" |
| |
| // Shader |
| |
| type Shader Object |
| |
| func CreateShader(type_ GLenum) Shader { return Shader(C.glCreateShader(C.GLenum(type_))) } |
| |
| func (shader Shader) Delete() { C.glDeleteShader(C.GLuint(shader)) } |
| |
| 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 (shader Shader) GetSource() string { |
| var length C.GLint |
| C.glGetShaderiv(C.GLuint(shader), C.GLenum(SHADER_SOURCE_LENGTH), &length) |
| |
| log := C.malloc(C.size_t(length + 1)) |
| C.gogl_glGetShaderSource(C.GLuint(shader), C.GLsizei(length), nil, (*C.GLchar)(log)) |
| |
| defer C.free(log) |
| |
| if length > 1 { |
| log := C.malloc(C.size_t(length + 1)) |
| defer C.free(log) |
| C.gogl_glGetShaderSource(C.GLuint(shader), C.GLsizei(length), nil, (*C.GLchar)(log)) |
| return C.GoString((*C.char)(log)) |
| } |
| return "" |
| } |
| |
| func (shader Shader) Source(source ...string) { |
| count := C.GLsizei(len(source)) |
| cstrings := make([]*C.GLchar, count) |
| length := make([]C.GLint, count) |
| |
| for i, s := range source { |
| csource := glString(s) |
| cstrings[i] = csource |
| length[i] = C.GLint(len(s)) |
| defer freeString(csource) |
| } |
| |
| C.glShaderSource(C.GLuint(shader), count, (**_Ctype_GLchar)(unsafe.Pointer(&cstrings[0])), (*_Ctype_GLint)(unsafe.Pointer(&length[0]))) |
| } |
| |
| func (shader Shader) Compile() { C.glCompileShader(C.GLuint(shader)) } |
| |
| func (shader Shader) Get(param GLenum) int { |
| var rv C.GLint |
| |
| C.glGetShaderiv(C.GLuint(shader), C.GLenum(param), &rv) |
| return int(rv) |
| } |