// Copyright 2015 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. package gl import ( "runtime" "syscall" "unsafe" ) // context is described in work.go. type context struct { debug int32 workAvailable chan struct{} work chan call retvalue chan uintptr // TODO(crawshaw): will not work with a moving collector cStringCounter int cStrings map[int]unsafe.Pointer } func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable } type context3 struct { *context } func NewContext() (Context, Worker) { if err := findDLLs(); err != nil { panic(err) } glctx := &context{ workAvailable: make(chan struct{}, 1), work: make(chan call, 3), retvalue: make(chan uintptr), cStrings: make(map[int]unsafe.Pointer), } return glctx, glctx } func (ctx *context) enqueue(c call) uintptr { ctx.work <- c select { case ctx.workAvailable <- struct{}{}: default: } if c.blocking { return <-ctx.retvalue } return 0 } func (ctx *context) DoWork() { // TODO: add a work queue for { select { case w := <-ctx.work: ret := ctx.doWork(w) if w.blocking { ctx.retvalue <- ret } default: return } } } func (ctx *context) cString(s string) (uintptr, func()) { buf := make([]byte, len(s)+1) for i := 0; i < len(s); i++ { buf[i] = s[i] } ret := unsafe.Pointer(&buf[0]) id := ctx.cStringCounter ctx.cStringCounter++ ctx.cStrings[id] = ret return uintptr(ret), func() { delete(ctx.cStrings, id) } } func (ctx *context) cStringPtr(str string) (uintptr, func()) { s, sfree := ctx.cString(str) sptr := [2]uintptr{s, 0} ret := unsafe.Pointer(&sptr[0]) id := ctx.cStringCounter ctx.cStringCounter++ ctx.cStrings[id] = ret return uintptr(ret), func() { sfree(); delete(ctx.cStrings, id) } } // fixFloat copies the first four arguments into the XMM registers. // This is for the windows/amd64 calling convention, that wants // floating point arguments to be passed in XMM. // // Mercifully, type information is not required to implement // this calling convention. In particular see the mixed int/float // examples: // // https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx // // This means it could be fixed in syscall.Syscall. The relevant // issue is // // https://golang.org/issue/6510 func fixFloat(x0, x1, x2, x3 uintptr) func (ctx *context) doWork(c call) (ret uintptr) { if runtime.GOARCH == "amd64" { fixFloat(c.args.a0, c.args.a1, c.args.a2, c.args.a3) } switch c.args.fn { case glfnActiveTexture: syscall.Syscall(glActiveTexture.Addr(), 1, c.args.a0, 0, 0) case glfnAttachShader: syscall.Syscall(glAttachShader.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBindAttribLocation: syscall.Syscall(glBindAttribLocation.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnBindBuffer: syscall.Syscall(glBindBuffer.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBindFramebuffer: syscall.Syscall(glBindFramebuffer.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBindRenderbuffer: syscall.Syscall(glBindRenderbuffer.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBindTexture: syscall.Syscall(glBindTexture.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBindVertexArray: syscall.Syscall(glBindVertexArray.Addr(), 1, c.args.a0, 0, 0) case glfnBlendColor: syscall.Syscall6(glBlendColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnBlendEquation: syscall.Syscall(glBlendEquation.Addr(), 1, c.args.a0, 0, 0) case glfnBlendEquationSeparate: syscall.Syscall(glBlendEquationSeparate.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBlendFunc: syscall.Syscall(glBlendFunc.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnBlendFuncSeparate: syscall.Syscall6(glBlendFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnBufferData: syscall.Syscall6(glBufferData.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), c.args.a2, 0, 0) case glfnBufferSubData: syscall.Syscall6(glBufferSubData.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(c.parg), 0, 0) case glfnCheckFramebufferStatus: ret, _, _ = syscall.Syscall(glCheckFramebufferStatus.Addr(), 1, c.args.a0, 0, 0) case glfnClear: syscall.Syscall(glClear.Addr(), 1, c.args.a0, 0, 0) case glfnClearColor: syscall.Syscall6(glClearColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnClearDepthf: syscall.Syscall6(glClearDepthf.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0) case glfnClearStencil: syscall.Syscall(glClearStencil.Addr(), 1, c.args.a0, 0, 0) case glfnColorMask: syscall.Syscall6(glColorMask.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnCompileShader: syscall.Syscall(glCompileShader.Addr(), 1, c.args.a0, 0, 0) case glfnCompressedTexImage2D: syscall.Syscall9(glCompressedTexImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, uintptr(c.parg), 0) case glfnCompressedTexSubImage2D: syscall.Syscall9(glCompressedTexSubImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, uintptr(c.parg)) case glfnCopyTexImage2D: syscall.Syscall9(glCopyTexImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, 0) case glfnCopyTexSubImage2D: syscall.Syscall9(glCopyTexSubImage2D.Addr(), 8, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, 0) case glfnCreateProgram: ret, _, _ = syscall.Syscall(glCreateProgram.Addr(), 0, 0, 0, 0) case glfnCreateShader: ret, _, _ = syscall.Syscall(glCreateShader.Addr(), 1, c.args.a0, 0, 0) case glfnCullFace: syscall.Syscall(glCullFace.Addr(), 1, c.args.a0, 0, 0) case glfnDeleteBuffer: syscall.Syscall(glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) case glfnDeleteFramebuffer: syscall.Syscall(glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) case glfnDeleteProgram: syscall.Syscall(glDeleteProgram.Addr(), 1, c.args.a0, 0, 0) case glfnDeleteRenderbuffer: syscall.Syscall(glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) case glfnDeleteShader: syscall.Syscall(glDeleteShader.Addr(), 1, c.args.a0, 0, 0) case glfnDeleteVertexArray: syscall.Syscall(glDeleteVertexArrays.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) case glfnDeleteTexture: syscall.Syscall(glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) case glfnDepthFunc: syscall.Syscall(glDepthFunc.Addr(), 1, c.args.a0, 0, 0) case glfnDepthRangef: syscall.Syscall6(glDepthRangef.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0) case glfnDepthMask: syscall.Syscall(glDepthMask.Addr(), 1, c.args.a0, 0, 0) case glfnDetachShader: syscall.Syscall(glDetachShader.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnDisable: syscall.Syscall(glDisable.Addr(), 1, c.args.a0, 0, 0) case glfnDisableVertexAttribArray: syscall.Syscall(glDisableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0) case glfnDrawArrays: syscall.Syscall(glDrawArrays.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnDrawElements: syscall.Syscall6(glDrawElements.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnEnable: syscall.Syscall(glEnable.Addr(), 1, c.args.a0, 0, 0) case glfnEnableVertexAttribArray: syscall.Syscall(glEnableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0) case glfnFinish: syscall.Syscall(glFinish.Addr(), 0, 0, 0, 0) case glfnFlush: syscall.Syscall(glFlush.Addr(), 0, 0, 0, 0) case glfnFramebufferRenderbuffer: syscall.Syscall6(glFramebufferRenderbuffer.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnFramebufferTexture2D: syscall.Syscall6(glFramebufferTexture2D.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0) case glfnFrontFace: syscall.Syscall(glFrontFace.Addr(), 1, c.args.a0, 0, 0) case glfnGenBuffer: syscall.Syscall(glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) case glfnGenFramebuffer: syscall.Syscall(glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) case glfnGenRenderbuffer: syscall.Syscall(glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) case glfnGenVertexArray: syscall.Syscall(glGenVertexArrays.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) case glfnGenTexture: syscall.Syscall(glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) case glfnGenerateMipmap: syscall.Syscall(glGenerateMipmap.Addr(), 1, c.args.a0, 0, 0) case glfnGetActiveAttrib: syscall.Syscall9(glGetActiveAttrib.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, 0, uintptr(unsafe.Pointer(&ret)), c.args.a3, uintptr(c.parg), 0, 0) case glfnGetActiveUniform: syscall.Syscall9(glGetActiveUniform.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, 0, uintptr(unsafe.Pointer(&ret)), c.args.a3, uintptr(c.parg), 0, 0) case glfnGetAttachedShaders: syscall.Syscall6(glGetAttachedShaders.Addr(), 4, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)), uintptr(c.parg), 0, 0) case glfnGetAttribLocation: ret, _, _ = syscall.Syscall(glGetAttribLocation.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnGetBooleanv: syscall.Syscall(glGetBooleanv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnGetBufferParameteri: syscall.Syscall(glGetBufferParameteri.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) case glfnGetError: ret, _, _ = syscall.Syscall(glGetError.Addr(), 0, 0, 0, 0) case glfnGetFloatv: syscall.Syscall(glGetFloatv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnGetFramebufferAttachmentParameteriv: syscall.Syscall6(glGetFramebufferAttachmentParameteriv.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(unsafe.Pointer(&ret)), 0, 0) case glfnGetIntegerv: syscall.Syscall(glGetIntegerv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnGetProgramInfoLog: syscall.Syscall6(glGetProgramInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnGetProgramiv: syscall.Syscall(glGetProgramiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) case glfnGetRenderbufferParameteriv: syscall.Syscall(glGetRenderbufferParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) case glfnGetShaderInfoLog: syscall.Syscall6(glGetShaderInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnGetShaderPrecisionFormat: // c.parg is a [3]int32. The first [2]int32 of the array is one // parameter, the final *int32 is another parameter. syscall.Syscall6(glGetShaderPrecisionFormat.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), uintptr(c.parg)+2*unsafe.Sizeof(uintptr(0)), 0, 0) case glfnGetShaderSource: syscall.Syscall6(glGetShaderSource.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnGetShaderiv: syscall.Syscall(glGetShaderiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) case glfnGetString: ret, _, _ = syscall.Syscall(glGetString.Addr(), 1, c.args.a0, 0, 0) case glfnGetTexParameterfv: syscall.Syscall(glGetTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnGetTexParameteriv: syscall.Syscall(glGetTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnGetUniformLocation: ret, _, _ = syscall.Syscall(glGetUniformLocation.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnGetUniformfv: syscall.Syscall(glGetUniformfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnGetUniformiv: syscall.Syscall(glGetUniformiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnGetVertexAttribfv: syscall.Syscall(glGetVertexAttribfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnGetVertexAttribiv: syscall.Syscall(glGetVertexAttribiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnHint: syscall.Syscall(glHint.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnIsBuffer: syscall.Syscall(glIsBuffer.Addr(), 1, c.args.a0, 0, 0) case glfnIsEnabled: syscall.Syscall(glIsEnabled.Addr(), 1, c.args.a0, 0, 0) case glfnIsFramebuffer: syscall.Syscall(glIsFramebuffer.Addr(), 1, c.args.a0, 0, 0) case glfnIsProgram: ret, _, _ = syscall.Syscall(glIsProgram.Addr(), 1, c.args.a0, 0, 0) case glfnIsRenderbuffer: syscall.Syscall(glIsRenderbuffer.Addr(), 1, c.args.a0, 0, 0) case glfnIsShader: syscall.Syscall(glIsShader.Addr(), 1, c.args.a0, 0, 0) case glfnIsTexture: syscall.Syscall(glIsTexture.Addr(), 1, c.args.a0, 0, 0) case glfnLineWidth: syscall.Syscall(glLineWidth.Addr(), 1, c.args.a0, 0, 0) case glfnLinkProgram: syscall.Syscall(glLinkProgram.Addr(), 1, c.args.a0, 0, 0) case glfnPixelStorei: syscall.Syscall(glPixelStorei.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnPolygonOffset: syscall.Syscall6(glPolygonOffset.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0) case glfnReadPixels: syscall.Syscall9(glReadPixels.Addr(), 7, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, uintptr(c.parg), 0, 0) case glfnReleaseShaderCompiler: syscall.Syscall(glReleaseShaderCompiler.Addr(), 0, 0, 0, 0) case glfnRenderbufferStorage: syscall.Syscall6(glRenderbufferStorage.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnSampleCoverage: syscall.Syscall6(glSampleCoverage.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0) case glfnScissor: syscall.Syscall6(glScissor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnShaderSource: syscall.Syscall6(glShaderSource.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, 0, 0, 0) case glfnStencilFunc: syscall.Syscall(glStencilFunc.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnStencilFuncSeparate: syscall.Syscall6(glStencilFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnStencilMask: syscall.Syscall(glStencilMask.Addr(), 1, c.args.a0, 0, 0) case glfnStencilMaskSeparate: syscall.Syscall(glStencilMaskSeparate.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnStencilOp: syscall.Syscall(glStencilOp.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnStencilOpSeparate: syscall.Syscall6(glStencilOpSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnTexImage2D: syscall.Syscall9(glTexImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0, c.args.a5, c.args.a6, uintptr(c.parg)) case glfnTexParameterf: syscall.Syscall6(glTexParameterf.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnTexParameterfv: syscall.Syscall(glTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnTexParameteri: syscall.Syscall(glTexParameteri.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnTexParameteriv: syscall.Syscall(glTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnTexSubImage2D: syscall.Syscall9(glTexSubImage2D.Addr(), 9, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5, c.args.a6, c.args.a7, uintptr(c.parg)) case glfnUniform1f: syscall.Syscall6(glUniform1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnUniform1fv: syscall.Syscall(glUniform1fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform1i: syscall.Syscall(glUniform1i.Addr(), 2, c.args.a0, c.args.a1, 0) case glfnUniform1iv: syscall.Syscall(glUniform1iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform2f: syscall.Syscall6(glUniform2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnUniform2fv: syscall.Syscall(glUniform2fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform2i: syscall.Syscall(glUniform2i.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) case glfnUniform2iv: syscall.Syscall(glUniform2iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform3f: syscall.Syscall6(glUniform3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnUniform3fv: syscall.Syscall(glUniform3fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform3i: syscall.Syscall6(glUniform3i.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) case glfnUniform3iv: syscall.Syscall(glUniform3iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform4f: syscall.Syscall6(glUniform4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnUniform4fv: syscall.Syscall(glUniform4fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniform4i: syscall.Syscall6(glUniform4i.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0) case glfnUniform4iv: syscall.Syscall(glUniform4iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) case glfnUniformMatrix2fv: syscall.Syscall6(glUniformMatrix2fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnUniformMatrix3fv: syscall.Syscall6(glUniformMatrix3fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnUniformMatrix4fv: syscall.Syscall6(glUniformMatrix4fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) case glfnUseProgram: syscall.Syscall(glUseProgram.Addr(), 1, c.args.a0, 0, 0) case glfnValidateProgram: syscall.Syscall(glValidateProgram.Addr(), 1, c.args.a0, 0, 0) case glfnVertexAttrib1f: syscall.Syscall6(glVertexAttrib1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnVertexAttrib1fv: syscall.Syscall(glVertexAttrib1fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnVertexAttrib2f: syscall.Syscall6(glVertexAttrib2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnVertexAttrib2fv: syscall.Syscall(glVertexAttrib2fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnVertexAttrib3f: syscall.Syscall6(glVertexAttrib3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnVertexAttrib3fv: syscall.Syscall(glVertexAttrib3fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnVertexAttrib4f: syscall.Syscall6(glVertexAttrib4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnVertexAttrib4fv: syscall.Syscall(glVertexAttrib4fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) case glfnVertexAttribPointer: syscall.Syscall6(glVertexAttribPointer.Addr(), 6, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) case glfnViewport: syscall.Syscall6(glViewport.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) default: panic("unknown GL function") } return ret } // Exported libraries for a Windows GUI driver. // // LibEGL is not used directly by the gl package, but is needed by any // driver hoping to use OpenGL ES. // // LibD3DCompiler is needed by libglesv2.dll for compiling shaders. var ( LibGLESv2 = syscall.NewLazyDLL("libglesv2.dll") LibEGL = syscall.NewLazyDLL("libegl.dll") LibD3DCompiler = syscall.NewLazyDLL("d3dcompiler_47.dll") ) var ( libGLESv2 = LibGLESv2 glActiveTexture = libGLESv2.NewProc("glActiveTexture") glAttachShader = libGLESv2.NewProc("glAttachShader") glBindAttribLocation = libGLESv2.NewProc("glBindAttribLocation") glBindBuffer = libGLESv2.NewProc("glBindBuffer") glBindFramebuffer = libGLESv2.NewProc("glBindFramebuffer") glBindRenderbuffer = libGLESv2.NewProc("glBindRenderbuffer") glBindTexture = libGLESv2.NewProc("glBindTexture") glBindVertexArray = libGLESv2.NewProc("glBindVertexArray") glBlendColor = libGLESv2.NewProc("glBlendColor") glBlendEquation = libGLESv2.NewProc("glBlendEquation") glBlendEquationSeparate = libGLESv2.NewProc("glBlendEquationSeparate") glBlendFunc = libGLESv2.NewProc("glBlendFunc") glBlendFuncSeparate = libGLESv2.NewProc("glBlendFuncSeparate") glBufferData = libGLESv2.NewProc("glBufferData") glBufferSubData = libGLESv2.NewProc("glBufferSubData") glCheckFramebufferStatus = libGLESv2.NewProc("glCheckFramebufferStatus") glClear = libGLESv2.NewProc("glClear") glClearColor = libGLESv2.NewProc("glClearColor") glClearDepthf = libGLESv2.NewProc("glClearDepthf") glClearStencil = libGLESv2.NewProc("glClearStencil") glColorMask = libGLESv2.NewProc("glColorMask") glCompileShader = libGLESv2.NewProc("glCompileShader") glCompressedTexImage2D = libGLESv2.NewProc("glCompressedTexImage2D") glCompressedTexSubImage2D = libGLESv2.NewProc("glCompressedTexSubImage2D") glCopyTexImage2D = libGLESv2.NewProc("glCopyTexImage2D") glCopyTexSubImage2D = libGLESv2.NewProc("glCopyTexSubImage2D") glCreateProgram = libGLESv2.NewProc("glCreateProgram") glCreateShader = libGLESv2.NewProc("glCreateShader") glCullFace = libGLESv2.NewProc("glCullFace") glDeleteBuffers = libGLESv2.NewProc("glDeleteBuffers") glDeleteFramebuffers = libGLESv2.NewProc("glDeleteFramebuffers") glDeleteProgram = libGLESv2.NewProc("glDeleteProgram") glDeleteRenderbuffers = libGLESv2.NewProc("glDeleteRenderbuffers") glDeleteShader = libGLESv2.NewProc("glDeleteShader") glDeleteTextures = libGLESv2.NewProc("glDeleteTextures") glDeleteVertexArrays = libGLESv2.NewProc("glDeleteVertexArrays") glDepthFunc = libGLESv2.NewProc("glDepthFunc") glDepthRangef = libGLESv2.NewProc("glDepthRangef") glDepthMask = libGLESv2.NewProc("glDepthMask") glDetachShader = libGLESv2.NewProc("glDetachShader") glDisable = libGLESv2.NewProc("glDisable") glDisableVertexAttribArray = libGLESv2.NewProc("glDisableVertexAttribArray") glDrawArrays = libGLESv2.NewProc("glDrawArrays") glDrawElements = libGLESv2.NewProc("glDrawElements") glEnable = libGLESv2.NewProc("glEnable") glEnableVertexAttribArray = libGLESv2.NewProc("glEnableVertexAttribArray") glFinish = libGLESv2.NewProc("glFinish") glFlush = libGLESv2.NewProc("glFlush") glFramebufferRenderbuffer = libGLESv2.NewProc("glFramebufferRenderbuffer") glFramebufferTexture2D = libGLESv2.NewProc("glFramebufferTexture2D") glFrontFace = libGLESv2.NewProc("glFrontFace") glGenBuffers = libGLESv2.NewProc("glGenBuffers") glGenFramebuffers = libGLESv2.NewProc("glGenFramebuffers") glGenRenderbuffers = libGLESv2.NewProc("glGenRenderbuffers") glGenTextures = libGLESv2.NewProc("glGenTextures") glGenVertexArrays = libGLESv2.NewProc("glGenVertexArrays") glGenerateMipmap = libGLESv2.NewProc("glGenerateMipmap") glGetActiveAttrib = libGLESv2.NewProc("glGetActiveAttrib") glGetActiveUniform = libGLESv2.NewProc("glGetActiveUniform") glGetAttachedShaders = libGLESv2.NewProc("glGetAttachedShaders") glGetAttribLocation = libGLESv2.NewProc("glGetAttribLocation") glGetBooleanv = libGLESv2.NewProc("glGetBooleanv") glGetBufferParameteri = libGLESv2.NewProc("glGetBufferParameteri") glGetError = libGLESv2.NewProc("glGetError") glGetFloatv = libGLESv2.NewProc("glGetFloatv") glGetFramebufferAttachmentParameteriv = libGLESv2.NewProc("glGetFramebufferAttachmentParameteriv") glGetIntegerv = libGLESv2.NewProc("glGetIntegerv") glGetProgramInfoLog = libGLESv2.NewProc("glGetProgramInfoLog") glGetProgramiv = libGLESv2.NewProc("glGetProgramiv") glGetRenderbufferParameteriv = libGLESv2.NewProc("glGetRenderbufferParameteriv") glGetShaderInfoLog = libGLESv2.NewProc("glGetShaderInfoLog") glGetShaderPrecisionFormat = libGLESv2.NewProc("glGetShaderPrecisionFormat") glGetShaderSource = libGLESv2.NewProc("glGetShaderSource") glGetShaderiv = libGLESv2.NewProc("glGetShaderiv") glGetString = libGLESv2.NewProc("glGetString") glGetTexParameterfv = libGLESv2.NewProc("glGetTexParameterfv") glGetTexParameteriv = libGLESv2.NewProc("glGetTexParameteriv") glGetUniformLocation = libGLESv2.NewProc("glGetUniformLocation") glGetUniformfv = libGLESv2.NewProc("glGetUniformfv") glGetUniformiv = libGLESv2.NewProc("glGetUniformiv") glGetVertexAttribfv = libGLESv2.NewProc("glGetVertexAttribfv") glGetVertexAttribiv = libGLESv2.NewProc("glGetVertexAttribiv") glHint = libGLESv2.NewProc("glHint") glIsBuffer = libGLESv2.NewProc("glIsBuffer") glIsEnabled = libGLESv2.NewProc("glIsEnabled") glIsFramebuffer = libGLESv2.NewProc("glIsFramebuffer") glIsProgram = libGLESv2.NewProc("glIsProgram") glIsRenderbuffer = libGLESv2.NewProc("glIsRenderbuffer") glIsShader = libGLESv2.NewProc("glIsShader") glIsTexture = libGLESv2.NewProc("glIsTexture") glLineWidth = libGLESv2.NewProc("glLineWidth") glLinkProgram = libGLESv2.NewProc("glLinkProgram") glPixelStorei = libGLESv2.NewProc("glPixelStorei") glPolygonOffset = libGLESv2.NewProc("glPolygonOffset") glReadPixels = libGLESv2.NewProc("glReadPixels") glReleaseShaderCompiler = libGLESv2.NewProc("glReleaseShaderCompiler") glRenderbufferStorage = libGLESv2.NewProc("glRenderbufferStorage") glSampleCoverage = libGLESv2.NewProc("glSampleCoverage") glScissor = libGLESv2.NewProc("glScissor") glShaderSource = libGLESv2.NewProc("glShaderSource") glStencilFunc = libGLESv2.NewProc("glStencilFunc") glStencilFuncSeparate = libGLESv2.NewProc("glStencilFuncSeparate") glStencilMask = libGLESv2.NewProc("glStencilMask") glStencilMaskSeparate = libGLESv2.NewProc("glStencilMaskSeparate") glStencilOp = libGLESv2.NewProc("glStencilOp") glStencilOpSeparate = libGLESv2.NewProc("glStencilOpSeparate") glTexImage2D = libGLESv2.NewProc("glTexImage2D") glTexParameterf = libGLESv2.NewProc("glTexParameterf") glTexParameterfv = libGLESv2.NewProc("glTexParameterfv") glTexParameteri = libGLESv2.NewProc("glTexParameteri") glTexParameteriv = libGLESv2.NewProc("glTexParameteriv") glTexSubImage2D = libGLESv2.NewProc("glTexSubImage2D") glUniform1f = libGLESv2.NewProc("glUniform1f") glUniform1fv = libGLESv2.NewProc("glUniform1fv") glUniform1i = libGLESv2.NewProc("glUniform1i") glUniform1iv = libGLESv2.NewProc("glUniform1iv") glUniform2f = libGLESv2.NewProc("glUniform2f") glUniform2fv = libGLESv2.NewProc("glUniform2fv") glUniform2i = libGLESv2.NewProc("glUniform2i") glUniform2iv = libGLESv2.NewProc("glUniform2iv") glUniform3f = libGLESv2.NewProc("glUniform3f") glUniform3fv = libGLESv2.NewProc("glUniform3fv") glUniform3i = libGLESv2.NewProc("glUniform3i") glUniform3iv = libGLESv2.NewProc("glUniform3iv") glUniform4f = libGLESv2.NewProc("glUniform4f") glUniform4fv = libGLESv2.NewProc("glUniform4fv") glUniform4i = libGLESv2.NewProc("glUniform4i") glUniform4iv = libGLESv2.NewProc("glUniform4iv") glUniformMatrix2fv = libGLESv2.NewProc("glUniformMatrix2fv") glUniformMatrix3fv = libGLESv2.NewProc("glUniformMatrix3fv") glUniformMatrix4fv = libGLESv2.NewProc("glUniformMatrix4fv") glUseProgram = libGLESv2.NewProc("glUseProgram") glValidateProgram = libGLESv2.NewProc("glValidateProgram") glVertexAttrib1f = libGLESv2.NewProc("glVertexAttrib1f") glVertexAttrib1fv = libGLESv2.NewProc("glVertexAttrib1fv") glVertexAttrib2f = libGLESv2.NewProc("glVertexAttrib2f") glVertexAttrib2fv = libGLESv2.NewProc("glVertexAttrib2fv") glVertexAttrib3f = libGLESv2.NewProc("glVertexAttrib3f") glVertexAttrib3fv = libGLESv2.NewProc("glVertexAttrib3fv") glVertexAttrib4f = libGLESv2.NewProc("glVertexAttrib4f") glVertexAttrib4fv = libGLESv2.NewProc("glVertexAttrib4fv") glVertexAttribPointer = libGLESv2.NewProc("glVertexAttribPointer") glViewport = libGLESv2.NewProc("glViewport") )