| // 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") |
| ) |