// Copyright 2014 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Generated from gl.go using go generate. DO NOT EDIT. // See doc.go for details. // +build linux darwin // +build gldebug package gl // #include "work.h" import "C" import ( "fmt" "log" "math" "unsafe" ) func errDrain() string { var errs []Enum for { e := GetError() if e == 0 { break } errs = append(errs, e) } if len(errs) > 0 { return fmt.Sprintf(" error: %v", errs) } return "" } func (v Enum) String() string { switch v { case 0x0: return "0" case 0x1: return "1" case 0x2: return "LINE_LOOP" case 0x3: return "LINE_STRIP" case 0x4: return "TRIANGLES" case 0x5: return "TRIANGLE_STRIP" case 0x6: return "TRIANGLE_FAN" case 0x300: return "SRC_COLOR" case 0x301: return "ONE_MINUS_SRC_COLOR" case 0x302: return "SRC_ALPHA" case 0x303: return "ONE_MINUS_SRC_ALPHA" case 0x304: return "DST_ALPHA" case 0x305: return "ONE_MINUS_DST_ALPHA" case 0x306: return "DST_COLOR" case 0x307: return "ONE_MINUS_DST_COLOR" case 0x308: return "SRC_ALPHA_SATURATE" case 0x8006: return "FUNC_ADD" case 0x8009: return "32777" case 0x883d: return "BLEND_EQUATION_ALPHA" case 0x800a: return "FUNC_SUBTRACT" case 0x800b: return "FUNC_REVERSE_SUBTRACT" case 0x80c8: return "BLEND_DST_RGB" case 0x80c9: return "BLEND_SRC_RGB" case 0x80ca: return "BLEND_DST_ALPHA" case 0x80cb: return "BLEND_SRC_ALPHA" case 0x8001: return "CONSTANT_COLOR" case 0x8002: return "ONE_MINUS_CONSTANT_COLOR" case 0x8003: return "CONSTANT_ALPHA" case 0x8004: return "ONE_MINUS_CONSTANT_ALPHA" case 0x8005: return "BLEND_COLOR" case 0x8892: return "ARRAY_BUFFER" case 0x8893: return "ELEMENT_ARRAY_BUFFER" case 0x8894: return "ARRAY_BUFFER_BINDING" case 0x8895: return "ELEMENT_ARRAY_BUFFER_BINDING" case 0x88e0: return "STREAM_DRAW" case 0x88e4: return "STATIC_DRAW" case 0x88e8: return "DYNAMIC_DRAW" case 0x8764: return "BUFFER_SIZE" case 0x8765: return "BUFFER_USAGE" case 0x8626: return "CURRENT_VERTEX_ATTRIB" case 0x404: return "FRONT" case 0x405: return "BACK" case 0x408: return "FRONT_AND_BACK" case 0xde1: return "TEXTURE_2D" case 0xb44: return "CULL_FACE" case 0xbe2: return "BLEND" case 0xbd0: return "DITHER" case 0xb90: return "STENCIL_TEST" case 0xb71: return "DEPTH_TEST" case 0xc11: return "SCISSOR_TEST" case 0x8037: return "POLYGON_OFFSET_FILL" case 0x809e: return "SAMPLE_ALPHA_TO_COVERAGE" case 0x80a0: return "SAMPLE_COVERAGE" case 0x500: return "INVALID_ENUM" case 0x501: return "INVALID_VALUE" case 0x502: return "INVALID_OPERATION" case 0x505: return "OUT_OF_MEMORY" case 0x900: return "CW" case 0x901: return "CCW" case 0xb21: return "LINE_WIDTH" case 0x846d: return "ALIASED_POINT_SIZE_RANGE" case 0x846e: return "ALIASED_LINE_WIDTH_RANGE" case 0xb45: return "CULL_FACE_MODE" case 0xb46: return "FRONT_FACE" case 0xb70: return "DEPTH_RANGE" case 0xb72: return "DEPTH_WRITEMASK" case 0xb73: return "DEPTH_CLEAR_VALUE" case 0xb74: return "DEPTH_FUNC" case 0xb91: return "STENCIL_CLEAR_VALUE" case 0xb92: return "STENCIL_FUNC" case 0xb94: return "STENCIL_FAIL" case 0xb95: return "STENCIL_PASS_DEPTH_FAIL" case 0xb96: return "STENCIL_PASS_DEPTH_PASS" case 0xb97: return "STENCIL_REF" case 0xb93: return "STENCIL_VALUE_MASK" case 0xb98: return "STENCIL_WRITEMASK" case 0x8800: return "STENCIL_BACK_FUNC" case 0x8801: return "STENCIL_BACK_FAIL" case 0x8802: return "STENCIL_BACK_PASS_DEPTH_FAIL" case 0x8803: return "STENCIL_BACK_PASS_DEPTH_PASS" case 0x8ca3: return "STENCIL_BACK_REF" case 0x8ca4: return "STENCIL_BACK_VALUE_MASK" case 0x8ca5: return "STENCIL_BACK_WRITEMASK" case 0xba2: return "VIEWPORT" case 0xc10: return "SCISSOR_BOX" case 0xc22: return "COLOR_CLEAR_VALUE" case 0xc23: return "COLOR_WRITEMASK" case 0xcf5: return "UNPACK_ALIGNMENT" case 0xd05: return "PACK_ALIGNMENT" case 0xd33: return "MAX_TEXTURE_SIZE" case 0xd3a: return "MAX_VIEWPORT_DIMS" case 0xd50: return "SUBPIXEL_BITS" case 0xd52: return "RED_BITS" case 0xd53: return "GREEN_BITS" case 0xd54: return "BLUE_BITS" case 0xd55: return "ALPHA_BITS" case 0xd56: return "DEPTH_BITS" case 0xd57: return "STENCIL_BITS" case 0x2a00: return "POLYGON_OFFSET_UNITS" case 0x8038: return "POLYGON_OFFSET_FACTOR" case 0x8069: return "TEXTURE_BINDING_2D" case 0x80a8: return "SAMPLE_BUFFERS" case 0x80a9: return "SAMPLES" case 0x80aa: return "SAMPLE_COVERAGE_VALUE" case 0x80ab: return "SAMPLE_COVERAGE_INVERT" case 0x86a2: return "NUM_COMPRESSED_TEXTURE_FORMATS" case 0x86a3: return "COMPRESSED_TEXTURE_FORMATS" case 0x1100: return "DONT_CARE" case 0x1101: return "FASTEST" case 0x1102: return "NICEST" case 0x8192: return "GENERATE_MIPMAP_HINT" case 0x1400: return "BYTE" case 0x1401: return "UNSIGNED_BYTE" case 0x1402: return "SHORT" case 0x1403: return "UNSIGNED_SHORT" case 0x1404: return "INT" case 0x1405: return "UNSIGNED_INT" case 0x1406: return "FLOAT" case 0x140c: return "FIXED" case 0x1902: return "DEPTH_COMPONENT" case 0x1906: return "ALPHA" case 0x1907: return "RGB" case 0x1908: return "RGBA" case 0x1909: return "LUMINANCE" case 0x190a: return "LUMINANCE_ALPHA" case 0x8033: return "UNSIGNED_SHORT_4_4_4_4" case 0x8034: return "UNSIGNED_SHORT_5_5_5_1" case 0x8363: return "UNSIGNED_SHORT_5_6_5" case 0x8869: return "MAX_VERTEX_ATTRIBS" case 0x8dfb: return "MAX_VERTEX_UNIFORM_VECTORS" case 0x8dfc: return "MAX_VARYING_VECTORS" case 0x8b4d: return "MAX_COMBINED_TEXTURE_IMAGE_UNITS" case 0x8b4c: return "MAX_VERTEX_TEXTURE_IMAGE_UNITS" case 0x8872: return "MAX_TEXTURE_IMAGE_UNITS" case 0x8dfd: return "MAX_FRAGMENT_UNIFORM_VECTORS" case 0x8b4f: return "SHADER_TYPE" case 0x8b80: return "DELETE_STATUS" case 0x8b82: return "LINK_STATUS" case 0x8b83: return "VALIDATE_STATUS" case 0x8b85: return "ATTACHED_SHADERS" case 0x8b86: return "ACTIVE_UNIFORMS" case 0x8b87: return "ACTIVE_UNIFORM_MAX_LENGTH" case 0x8b89: return "ACTIVE_ATTRIBUTES" case 0x8b8a: return "ACTIVE_ATTRIBUTE_MAX_LENGTH" case 0x8b8c: return "SHADING_LANGUAGE_VERSION" case 0x8b8d: return "CURRENT_PROGRAM" case 0x200: return "NEVER" case 0x201: return "LESS" case 0x202: return "EQUAL" case 0x203: return "LEQUAL" case 0x204: return "GREATER" case 0x205: return "NOTEQUAL" case 0x206: return "GEQUAL" case 0x207: return "ALWAYS" case 0x1e00: return "KEEP" case 0x1e01: return "REPLACE" case 0x1e02: return "INCR" case 0x1e03: return "DECR" case 0x150a: return "INVERT" case 0x8507: return "INCR_WRAP" case 0x8508: return "DECR_WRAP" case 0x1f00: return "VENDOR" case 0x1f01: return "RENDERER" case 0x1f02: return "VERSION" case 0x1f03: return "EXTENSIONS" case 0x2600: return "NEAREST" case 0x2601: return "LINEAR" case 0x2700: return "NEAREST_MIPMAP_NEAREST" case 0x2701: return "LINEAR_MIPMAP_NEAREST" case 0x2702: return "NEAREST_MIPMAP_LINEAR" case 0x2703: return "LINEAR_MIPMAP_LINEAR" case 0x2800: return "TEXTURE_MAG_FILTER" case 0x2801: return "TEXTURE_MIN_FILTER" case 0x2802: return "TEXTURE_WRAP_S" case 0x2803: return "TEXTURE_WRAP_T" case 0x1702: return "TEXTURE" case 0x8513: return "TEXTURE_CUBE_MAP" case 0x8514: return "TEXTURE_BINDING_CUBE_MAP" case 0x8515: return "TEXTURE_CUBE_MAP_POSITIVE_X" case 0x8516: return "TEXTURE_CUBE_MAP_NEGATIVE_X" case 0x8517: return "TEXTURE_CUBE_MAP_POSITIVE_Y" case 0x8518: return "TEXTURE_CUBE_MAP_NEGATIVE_Y" case 0x8519: return "TEXTURE_CUBE_MAP_POSITIVE_Z" case 0x851a: return "TEXTURE_CUBE_MAP_NEGATIVE_Z" case 0x851c: return "MAX_CUBE_MAP_TEXTURE_SIZE" case 0x84c0: return "TEXTURE0" case 0x84c1: return "TEXTURE1" case 0x84c2: return "TEXTURE2" case 0x84c3: return "TEXTURE3" case 0x84c4: return "TEXTURE4" case 0x84c5: return "TEXTURE5" case 0x84c6: return "TEXTURE6" case 0x84c7: return "TEXTURE7" case 0x84c8: return "TEXTURE8" case 0x84c9: return "TEXTURE9" case 0x84ca: return "TEXTURE10" case 0x84cb: return "TEXTURE11" case 0x84cc: return "TEXTURE12" case 0x84cd: return "TEXTURE13" case 0x84ce: return "TEXTURE14" case 0x84cf: return "TEXTURE15" case 0x84d0: return "TEXTURE16" case 0x84d1: return "TEXTURE17" case 0x84d2: return "TEXTURE18" case 0x84d3: return "TEXTURE19" case 0x84d4: return "TEXTURE20" case 0x84d5: return "TEXTURE21" case 0x84d6: return "TEXTURE22" case 0x84d7: return "TEXTURE23" case 0x84d8: return "TEXTURE24" case 0x84d9: return "TEXTURE25" case 0x84da: return "TEXTURE26" case 0x84db: return "TEXTURE27" case 0x84dc: return "TEXTURE28" case 0x84dd: return "TEXTURE29" case 0x84de: return "TEXTURE30" case 0x84df: return "TEXTURE31" case 0x84e0: return "ACTIVE_TEXTURE" case 0x2901: return "REPEAT" case 0x812f: return "CLAMP_TO_EDGE" case 0x8370: return "MIRRORED_REPEAT" case 0x8622: return "VERTEX_ATTRIB_ARRAY_ENABLED" case 0x8623: return "VERTEX_ATTRIB_ARRAY_SIZE" case 0x8624: return "VERTEX_ATTRIB_ARRAY_STRIDE" case 0x8625: return "VERTEX_ATTRIB_ARRAY_TYPE" case 0x886a: return "VERTEX_ATTRIB_ARRAY_NORMALIZED" case 0x8645: return "VERTEX_ATTRIB_ARRAY_POINTER" case 0x889f: return "VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" case 0x8b9a: return "IMPLEMENTATION_COLOR_READ_TYPE" case 0x8b9b: return "IMPLEMENTATION_COLOR_READ_FORMAT" case 0x8b81: return "COMPILE_STATUS" case 0x8b84: return "INFO_LOG_LENGTH" case 0x8b88: return "SHADER_SOURCE_LENGTH" case 0x8dfa: return "SHADER_COMPILER" case 0x8df8: return "SHADER_BINARY_FORMATS" case 0x8df9: return "NUM_SHADER_BINARY_FORMATS" case 0x8df0: return "LOW_FLOAT" case 0x8df1: return "MEDIUM_FLOAT" case 0x8df2: return "HIGH_FLOAT" case 0x8df3: return "LOW_INT" case 0x8df4: return "MEDIUM_INT" case 0x8df5: return "HIGH_INT" case 0x8d40: return "FRAMEBUFFER" case 0x8d41: return "RENDERBUFFER" case 0x8056: return "RGBA4" case 0x8057: return "RGB5_A1" case 0x8d62: return "RGB565" case 0x81a5: return "DEPTH_COMPONENT16" case 0x8d48: return "STENCIL_INDEX8" case 0x8d42: return "RENDERBUFFER_WIDTH" case 0x8d43: return "RENDERBUFFER_HEIGHT" case 0x8d44: return "RENDERBUFFER_INTERNAL_FORMAT" case 0x8d50: return "RENDERBUFFER_RED_SIZE" case 0x8d51: return "RENDERBUFFER_GREEN_SIZE" case 0x8d52: return "RENDERBUFFER_BLUE_SIZE" case 0x8d53: return "RENDERBUFFER_ALPHA_SIZE" case 0x8d54: return "RENDERBUFFER_DEPTH_SIZE" case 0x8d55: return "RENDERBUFFER_STENCIL_SIZE" case 0x8cd0: return "FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" case 0x8cd1: return "FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" case 0x8cd2: return "FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" case 0x8cd3: return "FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" case 0x8ce0: return "COLOR_ATTACHMENT0" case 0x8d00: return "DEPTH_ATTACHMENT" case 0x8d20: return "STENCIL_ATTACHMENT" case 0x8cd5: return "FRAMEBUFFER_COMPLETE" case 0x8cd6: return "FRAMEBUFFER_INCOMPLETE_ATTACHMENT" case 0x8cd7: return "FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" case 0x8cd9: return "FRAMEBUFFER_INCOMPLETE_DIMENSIONS" case 0x8cdd: return "FRAMEBUFFER_UNSUPPORTED" case 0x8ca6: return "FRAMEBUFFER_BINDING" case 0x8ca7: return "RENDERBUFFER_BINDING" case 0x84e8: return "MAX_RENDERBUFFER_SIZE" case 0x506: return "INVALID_FRAMEBUFFER_OPERATION" case 0x100: return "DEPTH_BUFFER_BIT" case 0x400: return "STENCIL_BUFFER_BIT" case 0x4000: return "COLOR_BUFFER_BIT" case 0x8b50: return "FLOAT_VEC2" case 0x8b51: return "FLOAT_VEC3" case 0x8b52: return "FLOAT_VEC4" case 0x8b53: return "INT_VEC2" case 0x8b54: return "INT_VEC3" case 0x8b55: return "INT_VEC4" case 0x8b56: return "BOOL" case 0x8b57: return "BOOL_VEC2" case 0x8b58: return "BOOL_VEC3" case 0x8b59: return "BOOL_VEC4" case 0x8b5a: return "FLOAT_MAT2" case 0x8b5b: return "FLOAT_MAT3" case 0x8b5c: return "FLOAT_MAT4" case 0x8b5e: return "SAMPLER_2D" case 0x8b60: return "SAMPLER_CUBE" case 0x8b30: return "FRAGMENT_SHADER" case 0x8b31: return "VERTEX_SHADER" default: return fmt.Sprintf("gl.Enum(0x%x)", uint32(v)) } } func ActiveTexture(texture Enum) { defer func() { errstr := errDrain() log.Printf("gl.ActiveTexture(%v) %v", texture, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnActiveTexture, a0: texture.c(), }, }) } func AttachShader(p Program, s Shader) { defer func() { errstr := errDrain() log.Printf("gl.AttachShader(%v, %v) %v", p, s, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnAttachShader, a0: p.c(), a1: s.c(), }, }) } func BindAttribLocation(p Program, a Attrib, name string) { defer func() { errstr := errDrain() log.Printf("gl.BindAttribLocation(%v, %v, %v) %v", p, a, name, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBindAttribLocation, a0: p.c(), a1: a.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(C.CString(name)))), }, }) } func BindBuffer(target Enum, b Buffer) { defer func() { errstr := errDrain() log.Printf("gl.BindBuffer(%v, %v) %v", target, b, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBindBuffer, a0: target.c(), a1: b.c(), }, }) } func BindFramebuffer(target Enum, fb Framebuffer) { defer func() { errstr := errDrain() log.Printf("gl.BindFramebuffer(%v, %v) %v", target, fb, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBindFramebuffer, a0: target.c(), a1: fb.c(), }, }) } func BindRenderbuffer(target Enum, rb Renderbuffer) { defer func() { errstr := errDrain() log.Printf("gl.BindRenderbuffer(%v, %v) %v", target, rb, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBindRenderbuffer, a0: target.c(), a1: rb.c(), }, }) } func BindTexture(target Enum, t Texture) { defer func() { errstr := errDrain() log.Printf("gl.BindTexture(%v, %v) %v", target, t, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBindTexture, a0: target.c(), a1: t.c(), }, }) } func BlendColor(red, green, blue, alpha float32) { defer func() { errstr := errDrain() log.Printf("gl.BlendColor(%v, %v, %v, %v) %v", red, green, blue, alpha, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBlendColor, a0: C.uintptr_t(math.Float32bits(red)), a1: C.uintptr_t(math.Float32bits(green)), a2: C.uintptr_t(math.Float32bits(blue)), a3: C.uintptr_t(math.Float32bits(alpha)), }, }) } func BlendEquation(mode Enum) { defer func() { errstr := errDrain() log.Printf("gl.BlendEquation(%v) %v", mode, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBlendEquation, a0: mode.c(), }, }) } func BlendEquationSeparate(modeRGB, modeAlpha Enum) { defer func() { errstr := errDrain() log.Printf("gl.BlendEquationSeparate(%v, %v) %v", modeRGB, modeAlpha, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBlendEquationSeparate, a0: modeRGB.c(), a1: modeAlpha.c(), }, }) } func BlendFunc(sfactor, dfactor Enum) { defer func() { errstr := errDrain() log.Printf("gl.BlendFunc(%v, %v) %v", sfactor, dfactor, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBlendFunc, a0: sfactor.c(), a1: dfactor.c(), }, }) } func BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha Enum) { defer func() { errstr := errDrain() log.Printf("gl.BlendFuncSeparate(%v, %v, %v, %v) %v", sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBlendFuncSeparate, a0: sfactorRGB.c(), a1: dfactorRGB.c(), a2: sfactorAlpha.c(), a3: dfactorAlpha.c(), }, }) } func BufferData(target Enum, src []byte, usage Enum) { defer func() { errstr := errDrain() log.Printf("gl.BufferData(%v, len(%d), %v) %v", target, len(src), usage, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBufferData, a0: target.c(), a1: C.uintptr_t(len(src)), a2: (C.uintptr_t)(uintptr(unsafe.Pointer(&src[0]))), a3: usage.c(), }, blocking: true, }) } func BufferInit(target Enum, size int, usage Enum) { defer func() { errstr := errDrain() log.Printf("gl.BufferInit(%v, %v, %v) %v", target, size, usage, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBufferData, a0: target.c(), a1: C.uintptr_t(size), a2: 0, a3: usage.c(), }, }) } func BufferSubData(target Enum, offset int, data []byte) { defer func() { errstr := errDrain() log.Printf("gl.BufferSubData(%v, %v, len(%d)) %v", target, offset, len(data), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnBufferSubData, a0: target.c(), a1: C.uintptr_t(offset), a2: C.uintptr_t(len(data)), a3: (C.uintptr_t)(uintptr(unsafe.Pointer(&data[0]))), }, blocking: true, }) } func CheckFramebufferStatus(target Enum) (r0 Enum) { defer func() { errstr := errDrain() log.Printf("gl.CheckFramebufferStatus(%v) %v%v", target, r0, errstr) }() return Enum(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCheckFramebufferStatus, a0: target.c(), }, blocking: true, })) } func Clear(mask Enum) { defer func() { errstr := errDrain() log.Printf("gl.Clear(%v) %v", mask, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnClear, a0: C.uintptr_t(mask), }, }) } func ClearColor(red, green, blue, alpha float32) { defer func() { errstr := errDrain() log.Printf("gl.ClearColor(%v, %v, %v, %v) %v", red, green, blue, alpha, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnClearColor, a0: C.uintptr_t(math.Float32bits(red)), a1: C.uintptr_t(math.Float32bits(green)), a2: C.uintptr_t(math.Float32bits(blue)), a3: C.uintptr_t(math.Float32bits(alpha)), }, }) } func ClearDepthf(d float32) { defer func() { errstr := errDrain() log.Printf("gl.ClearDepthf(%v) %v", d, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnClearDepthf, a0: C.uintptr_t(math.Float32bits(d)), }, }) } func ClearStencil(s int) { defer func() { errstr := errDrain() log.Printf("gl.ClearStencil(%v) %v", s, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnClearStencil, a0: C.uintptr_t(s), }, }) } func ColorMask(red, green, blue, alpha bool) { defer func() { errstr := errDrain() log.Printf("gl.ColorMask(%v, %v, %v, %v) %v", red, green, blue, alpha, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnColorMask, a0: glBoolean(red), a1: glBoolean(green), a2: glBoolean(blue), a3: glBoolean(alpha), }, }) } func CompileShader(s Shader) { defer func() { errstr := errDrain() log.Printf("gl.CompileShader(%v) %v", s, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCompileShader, a0: s.c(), }, }) } func CompressedTexImage2D(target Enum, level int, internalformat Enum, width, height, border int, data []byte) { defer func() { errstr := errDrain() log.Printf("gl.CompressedTexImage2D(%v, %v, %v, %v, %v, %v, len(%d)) %v", target, level, internalformat, width, height, border, len(data), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCompressedTexImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: internalformat.c(), a3: C.uintptr_t(width), a4: C.uintptr_t(height), a5: C.uintptr_t(border), a6: C.uintptr_t(len(data)), a7: C.uintptr_t(uintptr(unsafe.Pointer(&data[0]))), }, blocking: true, }) } func CompressedTexSubImage2D(target Enum, level, xoffset, yoffset, width, height int, format Enum, data []byte) { defer func() { errstr := errDrain() log.Printf("gl.CompressedTexSubImage2D(%v, %v, %v, %v, %v, %v, %v, len(%d)) %v", target, level, xoffset, yoffset, width, height, format, len(data), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCompressedTexSubImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: C.uintptr_t(xoffset), a3: C.uintptr_t(yoffset), a4: C.uintptr_t(width), a5: C.uintptr_t(height), a6: format.c(), a7: C.uintptr_t(len(data)), a8: C.uintptr_t(uintptr(unsafe.Pointer(&data[0]))), }, blocking: true, }) } func CopyTexImage2D(target Enum, level int, internalformat Enum, x, y, width, height, border int) { defer func() { errstr := errDrain() log.Printf("gl.CopyTexImage2D(%v, %v, %v, %v, %v, %v, %v, %v) %v", target, level, internalformat, x, y, width, height, border, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCopyTexImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: internalformat.c(), a3: C.uintptr_t(x), a4: C.uintptr_t(y), a5: C.uintptr_t(width), a6: C.uintptr_t(height), a7: C.uintptr_t(border), }, }) } func CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) { defer func() { errstr := errDrain() log.Printf("gl.CopyTexSubImage2D(%v, %v, %v, %v, %v, %v, %v, %v) %v", target, level, xoffset, yoffset, x, y, width, height, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCopyTexSubImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: C.uintptr_t(xoffset), a3: C.uintptr_t(yoffset), a4: C.uintptr_t(x), a5: C.uintptr_t(y), a6: C.uintptr_t(width), a7: C.uintptr_t(height), }, }) } func CreateBuffer() (r0 Buffer) { defer func() { errstr := errDrain() log.Printf("gl.CreateBuffer() %v%v", r0, errstr) }() return Buffer{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGenBuffer, }, blocking: true, }))} } func CreateFramebuffer() (r0 Framebuffer) { defer func() { errstr := errDrain() log.Printf("gl.CreateFramebuffer() %v%v", r0, errstr) }() return Framebuffer{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGenFramebuffer, }, blocking: true, }))} } func CreateProgram() (r0 Program) { defer func() { errstr := errDrain() log.Printf("gl.CreateProgram() %v%v", r0, errstr) }() return Program{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCreateProgram, }, blocking: true, }))} } func CreateRenderbuffer() (r0 Renderbuffer) { defer func() { errstr := errDrain() log.Printf("gl.CreateRenderbuffer() %v%v", r0, errstr) }() return Renderbuffer{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGenRenderbuffer, }, blocking: true, }))} } func CreateShader(ty Enum) (r0 Shader) { defer func() { errstr := errDrain() log.Printf("gl.CreateShader(%v) %v%v", ty, r0, errstr) }() return Shader{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCreateShader, a0: C.uintptr_t(ty), }, blocking: true, }))} } func CreateTexture() (r0 Texture) { defer func() { errstr := errDrain() log.Printf("gl.CreateTexture() %v%v", r0, errstr) }() return Texture{Value: uint32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGenTexture, }, blocking: true, }))} } func CullFace(mode Enum) { defer func() { errstr := errDrain() log.Printf("gl.CullFace(%v) %v", mode, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnCullFace, a0: mode.c(), }, }) } func DeleteBuffer(v Buffer) { defer func() { errstr := errDrain() log.Printf("gl.DeleteBuffer(%v) %v", v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteBuffer, a0: C.uintptr_t(v.Value), }, }) } func DeleteFramebuffer(v Framebuffer) { defer func() { errstr := errDrain() log.Printf("gl.DeleteFramebuffer(%v) %v", v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteFramebuffer, a0: C.uintptr_t(v.Value), }, }) } func DeleteProgram(p Program) { defer func() { errstr := errDrain() log.Printf("gl.DeleteProgram(%v) %v", p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteProgram, a0: p.c(), }, }) } func DeleteRenderbuffer(v Renderbuffer) { defer func() { errstr := errDrain() log.Printf("gl.DeleteRenderbuffer(%v) %v", v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteRenderbuffer, a0: v.c(), }, }) } func DeleteShader(s Shader) { defer func() { errstr := errDrain() log.Printf("gl.DeleteShader(%v) %v", s, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteShader, a0: s.c(), }, }) } func DeleteTexture(v Texture) { defer func() { errstr := errDrain() log.Printf("gl.DeleteTexture(%v) %v", v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDeleteTexture, a0: v.c(), }, }) } func DepthFunc(fn Enum) { defer func() { errstr := errDrain() log.Printf("gl.DepthFunc(%v) %v", fn, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDepthFunc, a0: fn.c(), }, }) } func DepthMask(flag bool) { defer func() { errstr := errDrain() log.Printf("gl.DepthMask(%v) %v", flag, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDepthMask, a0: glBoolean(flag), }, }) } func DepthRangef(n, f float32) { defer func() { errstr := errDrain() log.Printf("gl.DepthRangef(%v, %v) %v", n, f, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDepthRangef, a0: C.uintptr_t(math.Float32bits(n)), a1: C.uintptr_t(math.Float32bits(f)), }, }) } func DetachShader(p Program, s Shader) { defer func() { errstr := errDrain() log.Printf("gl.DetachShader(%v, %v) %v", p, s, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDetachShader, a0: p.c(), a1: s.c(), }, }) } func Disable(cap Enum) { defer func() { errstr := errDrain() log.Printf("gl.Disable(%v) %v", cap, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDisable, a0: cap.c(), }, }) } func DisableVertexAttribArray(a Attrib) { defer func() { errstr := errDrain() log.Printf("gl.DisableVertexAttribArray(%v) %v", a, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDisableVertexAttribArray, a0: a.c(), }, }) } func DrawArrays(mode Enum, first, count int) { defer func() { errstr := errDrain() log.Printf("gl.DrawArrays(%v, %v, %v) %v", mode, first, count, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDrawArrays, a0: mode.c(), a1: C.uintptr_t(first), a2: C.uintptr_t(count), }, }) } func DrawElements(mode Enum, count int, ty Enum, offset int) { defer func() { errstr := errDrain() log.Printf("gl.DrawElements(%v, %v, %v, %v) %v", mode, count, ty, offset, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnDrawElements, a0: mode.c(), a1: C.uintptr_t(count), a2: ty.c(), a3: C.uintptr_t(offset), }, }) } func Enable(cap Enum) { defer func() { errstr := errDrain() log.Printf("gl.Enable(%v) %v", cap, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnEnable, a0: cap.c(), }, }) } func EnableVertexAttribArray(a Attrib) { defer func() { errstr := errDrain() log.Printf("gl.EnableVertexAttribArray(%v) %v", a, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnEnableVertexAttribArray, a0: a.c(), }, }) } func Finish() { defer func() { errstr := errDrain() log.Printf("gl.Finish() %v", errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnFinish, }, blocking: true, }) } func Flush() { defer func() { errstr := errDrain() log.Printf("gl.Flush() %v", errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnFlush, }, blocking: true, }) } func FramebufferRenderbuffer(target, attachment, rbTarget Enum, rb Renderbuffer) { defer func() { errstr := errDrain() log.Printf("gl.FramebufferRenderbuffer(%v, %v, %v, %v) %v", target, attachment, rbTarget, rb, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnFramebufferRenderbuffer, a0: target.c(), a1: attachment.c(), a2: rbTarget.c(), a3: rb.c(), }, }) } func FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) { defer func() { errstr := errDrain() log.Printf("gl.FramebufferTexture2D(%v, %v, %v, %v, %v) %v", target, attachment, texTarget, t, level, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnFramebufferTexture2D, a0: target.c(), a1: attachment.c(), a2: texTarget.c(), a3: t.c(), a4: C.uintptr_t(level), }, }) } func FrontFace(mode Enum) { defer func() { errstr := errDrain() log.Printf("gl.FrontFace(%v) %v", mode, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnFrontFace, a0: mode.c(), }, }) } func GenerateMipmap(target Enum) { defer func() { errstr := errDrain() log.Printf("gl.GenerateMipmap(%v) %v", target, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGenerateMipmap, a0: target.c(), }, }) } func GetActiveAttrib(p Program, index uint32) (name string, size int, ty Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetActiveAttrib(%v, %v) (%v, %v, %v) %v", p, index, name, size, ty, errstr) }() bufSize := GetProgrami(p, ACTIVE_ATTRIBUTE_MAX_LENGTH) buf := C.malloc(C.size_t(bufSize)) defer C.free(buf) var cSize C.GLint var cType C.GLenum enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetActiveAttrib, a0: p.c(), a1: C.uintptr_t(index), a2: C.uintptr_t(bufSize), a3: 0, a4: C.uintptr_t(uintptr(unsafe.Pointer(&cSize))), a5: C.uintptr_t(uintptr(unsafe.Pointer(&cType))), a6: C.uintptr_t(uintptr(unsafe.Pointer(buf))), }, blocking: true, }) return C.GoString((*C.char)(buf)), int(cSize), Enum(cType) } func GetActiveUniform(p Program, index uint32) (name string, size int, ty Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetActiveUniform(%v, %v) (%v, %v, %v) %v", p, index, name, size, ty, errstr) }() bufSize := GetProgrami(p, ACTIVE_UNIFORM_MAX_LENGTH) buf := C.malloc(C.size_t(bufSize)) defer C.free(buf) var cSize C.GLint var cType C.GLenum enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetActiveUniform, a0: p.c(), a1: C.uintptr_t(index), a2: C.uintptr_t(bufSize), a3: 0, a4: C.uintptr_t(uintptr(unsafe.Pointer(&cSize))), a5: C.uintptr_t(uintptr(unsafe.Pointer(&cType))), a6: C.uintptr_t(uintptr(unsafe.Pointer(buf))), }, blocking: true, }) return C.GoString((*C.char)(buf)), int(cSize), Enum(cType) } func GetAttachedShaders(p Program) (r0 []Shader) { defer func() { errstr := errDrain() log.Printf("gl.GetAttachedShaders(%v) %v%v", p, r0, errstr) }() shadersLen := GetProgrami(p, ATTACHED_SHADERS) if shadersLen == 0 { return nil } var n C.GLsizei buf := make([]C.GLuint, shadersLen) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetAttachedShaders, a0: p.c(), a1: C.uintptr_t(shadersLen), a2: C.uintptr_t(uintptr(unsafe.Pointer(&n))), a3: C.uintptr_t(uintptr(unsafe.Pointer(&buf[0]))), }, blocking: true, }) buf = buf[:int(n)] shaders := make([]Shader, len(buf)) for i, s := range buf { shaders[i] = Shader{Value: uint32(s)} } return shaders } func GetAttribLocation(p Program, name string) (r0 Attrib) { defer func() { errstr := errDrain() r0.name = name log.Printf("gl.GetAttribLocation(%v, %v) %v%v", p, name, r0, errstr) }() return Attrib{Value: uint(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetAttribLocation, a0: p.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(C.CString(name)))), }, blocking: true, }))} } func GetBooleanv(dst []bool, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetBooleanv(%v, %v) %v", dst, pname, errstr) }() buf := make([]C.GLboolean, len(dst)) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetBooleanv, a0: pname.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&buf[0]))), }, blocking: true, }) for i, v := range buf { dst[i] = v != 0 } } func GetFloatv(dst []float32, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetFloatv(len(%d), %v) %v", len(dst), pname, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetFloatv, a0: pname.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetIntegerv(dst []int32, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetIntegerv(%v, %v) %v", dst, pname, errstr) }() buf := make([]C.GLint, len(dst)) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetIntegerv, a0: pname.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&buf[0]))), }, blocking: true, }) for i, v := range buf { dst[i] = int32(v) } } func GetInteger(pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetInteger(%v) %v%v", pname, r0, errstr) }() var v [1]int32 GetIntegerv(v[:], pname) return int(v[0]) } func GetBufferParameteri(target, value Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetBufferParameteri(%v, %v) %v%v", target, value, r0, errstr) }() return int(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetBufferParameteri, a0: target.c(), a1: value.c(), }, blocking: true, })) } func GetError() (r0 Enum) { return Enum(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetError, }, blocking: true, })) } func GetFramebufferAttachmentParameteri(target, attachment, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetFramebufferAttachmentParameteri(%v, %v, %v) %v%v", target, attachment, pname, r0, errstr) }() return int(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetFramebufferAttachmentParameteriv, a0: target.c(), a1: attachment.c(), a2: pname.c(), }, blocking: true, })) } func GetProgrami(p Program, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetProgrami(%v, %v) %v%v", p, pname, r0, errstr) }() return int(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetProgramiv, a0: p.c(), a1: pname.c(), }, blocking: true, })) } func GetProgramInfoLog(p Program) (r0 string) { defer func() { errstr := errDrain() log.Printf("gl.GetProgramInfoLog(%v) %v%v", p, r0, errstr) }() infoLen := GetProgrami(p, INFO_LOG_LENGTH) buf := C.malloc(C.size_t(infoLen)) defer C.free(buf) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetProgramInfoLog, a0: p.c(), a1: C.uintptr_t(infoLen), a2: 0, a3: C.uintptr_t(uintptr(buf)), }, blocking: true, }) return C.GoString((*C.char)(buf)) } func GetRenderbufferParameteri(target, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetRenderbufferParameteri(%v, %v) %v%v", target, pname, r0, errstr) }() return int(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetRenderbufferParameteriv, a0: target.c(), a1: pname.c(), }, blocking: true, })) } func GetShaderi(s Shader, pname Enum) (r0 int) { defer func() { errstr := errDrain() log.Printf("gl.GetShaderi(%v, %v) %v%v", s, pname, r0, errstr) }() return int(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetShaderiv, a0: s.c(), a1: pname.c(), }, blocking: true, })) } func GetShaderInfoLog(s Shader) (r0 string) { defer func() { errstr := errDrain() log.Printf("gl.GetShaderInfoLog(%v) %v%v", s, r0, errstr) }() infoLen := GetShaderi(s, INFO_LOG_LENGTH) buf := C.malloc(C.size_t(infoLen)) defer C.free(buf) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetShaderInfoLog, a0: s.c(), a1: C.uintptr_t(infoLen), a2: 0, a3: C.uintptr_t(uintptr(buf)), }, blocking: true, }) return C.GoString((*C.char)(buf)) } func GetShaderPrecisionFormat(shadertype, precisiontype Enum) (rangeLow, rangeHigh, precision int) { defer func() { errstr := errDrain() log.Printf("gl.GetShaderPrecisionFormat(%v, %v) (%v, %v, %v) %v", shadertype, precisiontype, rangeLow, rangeHigh, precision, errstr) }() var cRange [2]C.GLint var cPrecision C.GLint enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetShaderPrecisionFormat, a0: shadertype.c(), a1: precisiontype.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&cRange[0]))), a3: C.uintptr_t(uintptr(unsafe.Pointer(&cPrecision))), }, blocking: true, }) return int(cRange[0]), int(cRange[1]), int(cPrecision) } func GetShaderSource(s Shader) (r0 string) { defer func() { errstr := errDrain() log.Printf("gl.GetShaderSource(%v) %v%v", s, r0, errstr) }() sourceLen := GetShaderi(s, SHADER_SOURCE_LENGTH) if sourceLen == 0 { return "" } buf := C.malloc(C.size_t(sourceLen)) defer C.free(buf) enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetShaderSource, a0: s.c(), a1: C.uintptr_t(sourceLen), a2: 0, a3: C.uintptr_t(uintptr(buf)), }, blocking: true, }) return C.GoString((*C.char)(buf)) } func GetString(pname Enum) (r0 string) { defer func() { errstr := errDrain() log.Printf("gl.GetString(%v) %v%v", pname, r0, errstr) }() ret := enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetString, a0: pname.c(), }, blocking: true, }) return C.GoString((*C.char)((unsafe.Pointer(uintptr(ret))))) } func GetTexParameterfv(dst []float32, target, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetTexParameterfv(len(%d), %v, %v) %v", len(dst), target, pname, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetTexParameterfv, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetTexParameteriv(dst []int32, target, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetTexParameteriv(%v, %v, %v) %v", dst, target, pname, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetTexParameteriv, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetUniformfv(dst []float32, src Uniform, p Program) { defer func() { errstr := errDrain() log.Printf("gl.GetUniformfv(len(%d), %v, %v) %v", len(dst), src, p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetUniformfv, a0: p.c(), a1: src.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetUniformiv(dst []int32, src Uniform, p Program) { defer func() { errstr := errDrain() log.Printf("gl.GetUniformiv(%v, %v, %v) %v", dst, src, p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetUniformiv, a0: p.c(), a1: src.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetUniformLocation(p Program, name string) (r0 Uniform) { defer func() { errstr := errDrain() r0.name = name log.Printf("gl.GetUniformLocation(%v, %v) %v%v", p, name, r0, errstr) }() return Uniform{Value: int32(enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetUniformLocation, a0: p.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(C.CString(name)))), }, blocking: true, }))} } func GetVertexAttribf(src Attrib, pname Enum) (r0 float32) { defer func() { errstr := errDrain() log.Printf("gl.GetVertexAttribf(%v, %v) %v%v", src, pname, r0, errstr) }() var params [1]float32 GetVertexAttribfv(params[:], src, pname) return params[0] } func GetVertexAttribfv(dst []float32, src Attrib, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetVertexAttribfv(len(%d), %v, %v) %v", len(dst), src, pname, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetVertexAttribfv, a0: src.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func GetVertexAttribi(src Attrib, pname Enum) (r0 int32) { defer func() { errstr := errDrain() log.Printf("gl.GetVertexAttribi(%v, %v) %v%v", src, pname, r0, errstr) }() var params [1]int32 GetVertexAttribiv(params[:], src, pname) return params[0] } func GetVertexAttribiv(dst []int32, src Attrib, pname Enum) { defer func() { errstr := errDrain() log.Printf("gl.GetVertexAttribiv(%v, %v, %v) %v", dst, src, pname, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnGetVertexAttribiv, a0: src.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func Hint(target, mode Enum) { defer func() { errstr := errDrain() log.Printf("gl.Hint(%v, %v) %v", target, mode, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnHint, a0: target.c(), a1: mode.c(), }, }) } func IsBuffer(b Buffer) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsBuffer(%v) %v%v", b, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsBuffer, a0: b.c(), }, blocking: true, }) } func IsEnabled(cap Enum) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsEnabled(%v) %v%v", cap, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsEnabled, a0: cap.c(), }, blocking: true, }) } func IsFramebuffer(fb Framebuffer) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsFramebuffer(%v) %v%v", fb, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsFramebuffer, a0: fb.c(), }, blocking: true, }) } func IsProgram(p Program) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsProgram(%v) %v%v", p, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsProgram, a0: p.c(), }, blocking: true, }) } func IsRenderbuffer(rb Renderbuffer) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsRenderbuffer(%v) %v%v", rb, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsRenderbuffer, a0: rb.c(), }, blocking: true, }) } func IsShader(s Shader) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsShader(%v) %v%v", s, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsShader, a0: s.c(), }, blocking: true, }) } func IsTexture(t Texture) (r0 bool) { defer func() { errstr := errDrain() log.Printf("gl.IsTexture(%v) %v%v", t, r0, errstr) }() return 0 != enqueue(call{ args: C.struct_fnargs{ fn: C.glfnIsTexture, a0: t.c(), }, blocking: true, }) } func LineWidth(width float32) { defer func() { errstr := errDrain() log.Printf("gl.LineWidth(%v) %v", width, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnLineWidth, a0: C.uintptr_t(math.Float32bits(width)), }, }) } func LinkProgram(p Program) { defer func() { errstr := errDrain() log.Printf("gl.LinkProgram(%v) %v", p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnLinkProgram, a0: p.c(), }, }) } func PixelStorei(pname Enum, param int32) { defer func() { errstr := errDrain() log.Printf("gl.PixelStorei(%v, %v) %v", pname, param, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnPixelStorei, a0: pname.c(), a1: C.uintptr_t(param), }, }) } func PolygonOffset(factor, units float32) { defer func() { errstr := errDrain() log.Printf("gl.PolygonOffset(%v, %v) %v", factor, units, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnPolygonOffset, a0: C.uintptr_t(math.Float32bits(factor)), a1: C.uintptr_t(math.Float32bits(units)), }, }) } func ReadPixels(dst []byte, x, y, width, height int, format, ty Enum) { defer func() { errstr := errDrain() log.Printf("gl.ReadPixels(len(%d), %v, %v, %v, %v, %v, %v) %v", len(dst), x, y, width, height, format, ty, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnReadPixels, a0: C.uintptr_t(x), a1: C.uintptr_t(y), a2: C.uintptr_t(width), a3: C.uintptr_t(height), a4: format.c(), a5: ty.c(), a6: C.uintptr_t(uintptr(unsafe.Pointer(&dst[0]))), }, blocking: true, }) } func ReleaseShaderCompiler() { defer func() { errstr := errDrain() log.Printf("gl.ReleaseShaderCompiler() %v", errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnReleaseShaderCompiler, }, }) } func RenderbufferStorage(target, internalFormat Enum, width, height int) { defer func() { errstr := errDrain() log.Printf("gl.RenderbufferStorage(%v, %v, %v, %v) %v", target, internalFormat, width, height, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnRenderbufferStorage, a0: target.c(), a1: internalFormat.c(), a2: C.uintptr_t(width), a3: C.uintptr_t(height), }, }) } func SampleCoverage(value float32, invert bool) { defer func() { errstr := errDrain() log.Printf("gl.SampleCoverage(%v, %v) %v", value, invert, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnSampleCoverage, a0: C.uintptr_t(math.Float32bits(value)), a1: glBoolean(invert), }, }) } func Scissor(x, y, width, height int32) { defer func() { errstr := errDrain() log.Printf("gl.Scissor(%v, %v, %v, %v) %v", x, y, width, height, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnScissor, a0: C.uintptr_t(x), a1: C.uintptr_t(y), a2: C.uintptr_t(width), a3: C.uintptr_t(height), }, }) } func ShaderSource(s Shader, src string) { defer func() { errstr := errDrain() log.Printf("gl.ShaderSource(%v, %v) %v", s, src, errstr) }() cstr := C.CString(src) cstrp := (**C.char)(C.malloc(C.size_t(unsafe.Sizeof(cstr)))) *cstrp = cstr enqueue(call{ args: C.struct_fnargs{ fn: C.glfnShaderSource, a0: s.c(), a1: 1, a2: C.uintptr_t(uintptr(unsafe.Pointer(cstrp))), }, }) } func StencilFunc(fn Enum, ref int, mask uint32) { defer func() { errstr := errDrain() log.Printf("gl.StencilFunc(%v, %v, %v) %v", fn, ref, mask, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilFunc, a0: fn.c(), a1: C.uintptr_t(ref), a2: C.uintptr_t(mask), }, }) } func StencilFuncSeparate(face, fn Enum, ref int, mask uint32) { defer func() { errstr := errDrain() log.Printf("gl.StencilFuncSeparate(%v, %v, %v, %v) %v", face, fn, ref, mask, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilFuncSeparate, a0: face.c(), a1: fn.c(), a2: C.uintptr_t(ref), a3: C.uintptr_t(mask), }, }) } func StencilMask(mask uint32) { defer func() { errstr := errDrain() log.Printf("gl.StencilMask(%v) %v", mask, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilMask, a0: C.uintptr_t(mask), }, }) } func StencilMaskSeparate(face Enum, mask uint32) { defer func() { errstr := errDrain() log.Printf("gl.StencilMaskSeparate(%v, %v) %v", face, mask, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilMaskSeparate, a0: face.c(), a1: C.uintptr_t(mask), }, }) } func StencilOp(fail, zfail, zpass Enum) { defer func() { errstr := errDrain() log.Printf("gl.StencilOp(%v, %v, %v) %v", fail, zfail, zpass, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilOp, a0: fail.c(), a1: zfail.c(), a2: zpass.c(), }, }) } func StencilOpSeparate(face, sfail, dpfail, dppass Enum) { defer func() { errstr := errDrain() log.Printf("gl.StencilOpSeparate(%v, %v, %v, %v) %v", face, sfail, dpfail, dppass, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnStencilOpSeparate, a0: face.c(), a1: sfail.c(), a2: dpfail.c(), a3: dppass.c(), }, }) } func TexImage2D(target Enum, level int, width, height int, format Enum, ty Enum, data []byte) { defer func() { errstr := errDrain() log.Printf("gl.TexImage2D(%v, %v, %v, %v, %v, %v, len(%d)) %v", target, level, width, height, format, ty, len(data), errstr) }() blocking, a7 := false, C.uintptr_t(0) if len(data) > 0 { blocking, a7 = true, C.uintptr_t(uintptr(unsafe.Pointer(&data[0]))) } enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: C.uintptr_t(format), a3: C.uintptr_t(width), a4: C.uintptr_t(height), a5: format.c(), a6: ty.c(), a7: a7, }, blocking: blocking, }) } func TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte) { defer func() { errstr := errDrain() log.Printf("gl.TexSubImage2D(%v, %v, %v, %v, %v, %v, %v, %v, len(%d)) %v", target, level, x, y, width, height, format, ty, len(data), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexSubImage2D, a0: target.c(), a1: C.uintptr_t(level), a2: C.uintptr_t(x), a3: C.uintptr_t(y), a4: C.uintptr_t(width), a5: C.uintptr_t(height), a6: format.c(), a7: ty.c(), a8: C.uintptr_t(uintptr(unsafe.Pointer(&data[0]))), }, blocking: true, }) } func TexParameterf(target, pname Enum, param float32) { defer func() { errstr := errDrain() log.Printf("gl.TexParameterf(%v, %v, %v) %v", target, pname, param, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexParameterf, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(math.Float32bits(param)), }, }) } func TexParameterfv(target, pname Enum, params []float32) { defer func() { errstr := errDrain() log.Printf("gl.TexParameterfv(%v, %v, len(%d)) %v", target, pname, len(params), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexParameterfv, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(¶ms[0]))), }, blocking: true, }) } func TexParameteri(target, pname Enum, param int) { defer func() { errstr := errDrain() log.Printf("gl.TexParameteri(%v, %v, %v) %v", target, pname, param, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexParameteri, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(param), }, }) } func TexParameteriv(target, pname Enum, params []int32) { defer func() { errstr := errDrain() log.Printf("gl.TexParameteriv(%v, %v, %v) %v", target, pname, params, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnTexParameteriv, a0: target.c(), a1: pname.c(), a2: C.uintptr_t(uintptr(unsafe.Pointer(¶ms[0]))), }, blocking: true, }) } func Uniform1f(dst Uniform, v float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform1f(%v, %v) %v", dst, v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform1f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(v)), }, }) } func Uniform1fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform1fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform1fv, a0: dst.c(), a1: C.uintptr_t(len(src)), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform1i(dst Uniform, v int) { defer func() { errstr := errDrain() log.Printf("gl.Uniform1i(%v, %v) %v", dst, v, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform1i, a0: dst.c(), a1: C.uintptr_t(v), }, }) } func Uniform1iv(dst Uniform, src []int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform1iv(%v, %v) %v", dst, src, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform1iv, a0: dst.c(), a1: C.uintptr_t(len(src)), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform2f(dst Uniform, v0, v1 float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform2f(%v, %v, %v) %v", dst, v0, v1, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform2f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(v0)), a2: C.uintptr_t(math.Float32bits(v1)), }, }) } func Uniform2fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform2fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform2fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 2), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform2i(dst Uniform, v0, v1 int) { defer func() { errstr := errDrain() log.Printf("gl.Uniform2i(%v, %v, %v) %v", dst, v0, v1, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform2i, a0: dst.c(), a1: C.uintptr_t(v0), a2: C.uintptr_t(v1), }, }) } func Uniform2iv(dst Uniform, src []int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform2iv(%v, %v) %v", dst, src, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform2iv, a0: dst.c(), a1: C.uintptr_t(len(src) / 2), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform3f(dst Uniform, v0, v1, v2 float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform3f(%v, %v, %v, %v) %v", dst, v0, v1, v2, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform3f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(v0)), a2: C.uintptr_t(math.Float32bits(v1)), a3: C.uintptr_t(math.Float32bits(v2)), }, }) } func Uniform3fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform3fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform3fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 3), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform3i(dst Uniform, v0, v1, v2 int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform3i(%v, %v, %v, %v) %v", dst, v0, v1, v2, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform3i, a0: dst.c(), a1: C.uintptr_t(v0), a2: C.uintptr_t(v1), a3: C.uintptr_t(v2), }, }) } func Uniform3iv(dst Uniform, src []int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform3iv(%v, %v) %v", dst, src, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform3iv, a0: dst.c(), a1: C.uintptr_t(len(src) / 3), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform4f(dst Uniform, v0, v1, v2, v3 float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform4f(%v, %v, %v, %v, %v) %v", dst, v0, v1, v2, v3, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform4f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(v0)), a2: C.uintptr_t(math.Float32bits(v1)), a3: C.uintptr_t(math.Float32bits(v2)), a4: C.uintptr_t(math.Float32bits(v3)), }, }) } func Uniform4fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform4fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform4fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 4), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func Uniform4i(dst Uniform, v0, v1, v2, v3 int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform4i(%v, %v, %v, %v, %v) %v", dst, v0, v1, v2, v3, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform4i, a0: dst.c(), a1: C.uintptr_t(v0), a2: C.uintptr_t(v1), a3: C.uintptr_t(v2), a4: C.uintptr_t(v3), }, }) } func Uniform4iv(dst Uniform, src []int32) { defer func() { errstr := errDrain() log.Printf("gl.Uniform4iv(%v, %v) %v", dst, src, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniform4iv, a0: dst.c(), a1: C.uintptr_t(len(src) / 4), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func UniformMatrix2fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.UniformMatrix2fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniformMatrix2fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 4), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func UniformMatrix3fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.UniformMatrix3fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniformMatrix3fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 9), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func UniformMatrix4fv(dst Uniform, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.UniformMatrix4fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUniformMatrix4fv, a0: dst.c(), a1: C.uintptr_t(len(src) / 16), a2: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func UseProgram(p Program) { defer func() { errstr := errDrain() log.Printf("gl.UseProgram(%v) %v", p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnUseProgram, a0: p.c(), }, }) } func ValidateProgram(p Program) { defer func() { errstr := errDrain() log.Printf("gl.ValidateProgram(%v) %v", p, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnValidateProgram, a0: p.c(), }, }) } func VertexAttrib1f(dst Attrib, x float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib1f(%v, %v) %v", dst, x, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib1f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(x)), }, }) } func VertexAttrib1fv(dst Attrib, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib1fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib1fv, a0: dst.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func VertexAttrib2f(dst Attrib, x, y float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib2f(%v, %v, %v) %v", dst, x, y, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib2f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(x)), a2: C.uintptr_t(math.Float32bits(y)), }, }) } func VertexAttrib2fv(dst Attrib, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib2fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib2fv, a0: dst.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func VertexAttrib3f(dst Attrib, x, y, z float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib3f(%v, %v, %v, %v) %v", dst, x, y, z, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib3f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(x)), a2: C.uintptr_t(math.Float32bits(y)), a3: C.uintptr_t(math.Float32bits(z)), }, }) } func VertexAttrib3fv(dst Attrib, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib3fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib3fv, a0: dst.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func VertexAttrib4f(dst Attrib, x, y, z, w float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib4f(%v, %v, %v, %v, %v) %v", dst, x, y, z, w, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib4f, a0: dst.c(), a1: C.uintptr_t(math.Float32bits(x)), a2: C.uintptr_t(math.Float32bits(y)), a3: C.uintptr_t(math.Float32bits(z)), a4: C.uintptr_t(math.Float32bits(w)), }, }) } func VertexAttrib4fv(dst Attrib, src []float32) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttrib4fv(%v, len(%d)) %v", dst, len(src), errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttrib4fv, a0: dst.c(), a1: C.uintptr_t(uintptr(unsafe.Pointer(&src[0]))), }, blocking: true, }) } func VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) { defer func() { errstr := errDrain() log.Printf("gl.VertexAttribPointer(%v, %v, %v, %v, %v, %v) %v", dst, size, ty, normalized, stride, offset, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnVertexAttribPointer, a0: dst.c(), a1: C.uintptr_t(size), a2: ty.c(), a3: glBoolean(normalized), a4: C.uintptr_t(stride), a5: C.uintptr_t(offset), }, }) } func Viewport(x, y, width, height int) { defer func() { errstr := errDrain() log.Printf("gl.Viewport(%v, %v, %v, %v) %v", x, y, width, height, errstr) }() enqueue(call{ args: C.struct_fnargs{ fn: C.glfnViewport, a0: C.uintptr_t(x), a1: C.uintptr_t(y), a2: C.uintptr_t(width), a3: C.uintptr_t(height), }, }) }