github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/mobile/gl/work_windows.go (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package gl 6 7 import ( 8 "syscall" 9 "unsafe" 10 ) 11 12 // context is described in work.go. 13 type context struct { 14 debug int32 15 workAvailable chan struct{} 16 work chan call 17 retvalue chan uintptr 18 19 // TODO(crawshaw): will not work with a moving collector 20 cStringCounter int 21 cStrings map[int]unsafe.Pointer 22 } 23 24 func (ctx *context) WorkAvailable() <-chan struct{} { return ctx.workAvailable } 25 26 func NewContext() (Context, Worker) { 27 if err := findDLLs(); err != nil { 28 panic(err) 29 } 30 glctx := &context{ 31 workAvailable: make(chan struct{}, 1), 32 work: make(chan call, 3), 33 retvalue: make(chan uintptr), 34 cStrings: make(map[int]unsafe.Pointer), 35 } 36 return glctx, glctx 37 } 38 39 func (ctx *context) enqueue(c call) uintptr { 40 ctx.work <- c 41 42 select { 43 case ctx.workAvailable <- struct{}{}: 44 default: 45 } 46 47 if c.blocking { 48 return <-ctx.retvalue 49 } 50 return 0 51 } 52 53 func (ctx *context) DoWork() { 54 // TODO: add a work queue 55 for { 56 select { 57 case w := <-ctx.work: 58 ret := ctx.doWork(w) 59 if w.blocking { 60 ctx.retvalue <- ret 61 } 62 default: 63 return 64 } 65 } 66 } 67 68 func (ctx *context) cString(s string) (uintptr, func()) { 69 buf := make([]byte, len(s)+1) 70 for i := 0; i < len(s); i++ { 71 buf[i] = s[i] 72 } 73 ret := unsafe.Pointer(&buf[0]) 74 id := ctx.cStringCounter 75 ctx.cStringCounter++ 76 ctx.cStrings[id] = ret 77 return uintptr(ret), func() { delete(ctx.cStrings, id) } 78 } 79 80 func (ctx *context) cStringPtr(str string) (uintptr, func()) { 81 s, sfree := ctx.cString(str) 82 sptr := [2]uintptr{s, 0} 83 ret := unsafe.Pointer(&sptr[0]) 84 id := ctx.cStringCounter 85 ctx.cStringCounter++ 86 ctx.cStrings[id] = ret 87 return uintptr(ret), func() { sfree(); delete(ctx.cStrings, id) } 88 } 89 90 // fixFloat copies the first four arguments into the XMM registers. 91 // This is for the windows/amd64 calling convention, that wants 92 // floating point arguments to be passed in XMM. 93 // 94 // Mercifully, type information is not required to implement 95 // this calling convention. In particular see the mixed int/float 96 // examples: 97 // 98 // https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx 99 // 100 // This means it could be fixed in syscall.Syscall. The relevant 101 // issue is 102 // 103 // https://golang.org/issue/6510 104 func fixFloat(x0, x1, x2, x3 uintptr) 105 106 func (ctx *context) doWork(c call) (ret uintptr) { 107 fixFloat(c.args.a0, c.args.a1, c.args.a2, c.args.a3) 108 109 switch c.args.fn { 110 case glfnActiveTexture: 111 syscall.Syscall(glActiveTexture.Addr(), 1, c.args.a0, 0, 0) 112 case glfnAttachShader: 113 syscall.Syscall(glAttachShader.Addr(), 2, c.args.a0, c.args.a1, 0) 114 case glfnBindAttribLocation: 115 syscall.Syscall(glBindAttribLocation.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 116 case glfnBindBuffer: 117 syscall.Syscall(glBindBuffer.Addr(), 2, c.args.a0, c.args.a1, 0) 118 case glfnBindFramebuffer: 119 syscall.Syscall(glBindFramebuffer.Addr(), 2, c.args.a0, c.args.a1, 0) 120 case glfnBindRenderbuffer: 121 syscall.Syscall(glBindRenderbuffer.Addr(), 2, c.args.a0, c.args.a1, 0) 122 case glfnBindTexture: 123 syscall.Syscall(glBindTexture.Addr(), 2, c.args.a0, c.args.a1, 0) 124 case glfnBlendColor: 125 syscall.Syscall6(glBlendColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 126 case glfnBlendEquation: 127 syscall.Syscall(glBlendEquation.Addr(), 1, c.args.a0, 0, 0) 128 case glfnBlendEquationSeparate: 129 syscall.Syscall(glBlendEquationSeparate.Addr(), 2, c.args.a0, c.args.a1, 0) 130 case glfnBlendFunc: 131 syscall.Syscall(glBlendFunc.Addr(), 2, c.args.a0, c.args.a1, 0) 132 case glfnBlendFuncSeparate: 133 syscall.Syscall6(glBlendFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 134 case glfnBufferData: 135 syscall.Syscall6(glBufferData.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), c.args.a2, 0, 0) 136 case glfnBufferSubData: 137 syscall.Syscall6(glBufferSubData.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(c.parg), 0, 0) 138 case glfnCheckFramebufferStatus: 139 ret, _, _ = syscall.Syscall(glCheckFramebufferStatus.Addr(), 1, c.args.a0, 0, 0) 140 case glfnClear: 141 syscall.Syscall(glClear.Addr(), 1, c.args.a0, 0, 0) 142 case glfnClearColor: 143 syscall.Syscall6(glClearColor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 144 case glfnClearDepthf: 145 syscall.Syscall6(glClearDepthf.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0) 146 case glfnClearStencil: 147 syscall.Syscall(glClearStencil.Addr(), 1, c.args.a0, 0, 0) 148 case glfnColorMask: 149 syscall.Syscall6(glColorMask.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 150 case glfnCompileShader: 151 syscall.Syscall(glCompileShader.Addr(), 1, c.args.a0, 0, 0) 152 case glfnCompressedTexImage2D: 153 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) 154 case glfnCompressedTexSubImage2D: 155 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)) 156 case glfnCopyTexImage2D: 157 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) 158 case glfnCopyTexSubImage2D: 159 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) 160 case glfnCreateProgram: 161 ret, _, _ = syscall.Syscall(glCreateProgram.Addr(), 0, 0, 0, 0) 162 case glfnCreateShader: 163 ret, _, _ = syscall.Syscall(glCreateShader.Addr(), 1, c.args.a0, 0, 0) 164 case glfnCullFace: 165 syscall.Syscall(glCullFace.Addr(), 1, c.args.a0, 0, 0) 166 case glfnDeleteBuffer: 167 syscall.Syscall(glDeleteBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) 168 case glfnDeleteFramebuffer: 169 syscall.Syscall(glDeleteFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) 170 case glfnDeleteProgram: 171 syscall.Syscall(glDeleteProgram.Addr(), 1, c.args.a0, 0, 0) 172 case glfnDeleteRenderbuffer: 173 syscall.Syscall(glDeleteRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) 174 case glfnDeleteShader: 175 syscall.Syscall(glDeleteShader.Addr(), 1, c.args.a0, 0, 0) 176 case glfnDeleteTexture: 177 syscall.Syscall(glDeleteTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&c.args.a0)), 0) 178 case glfnDepthFunc: 179 syscall.Syscall(glDepthFunc.Addr(), 1, c.args.a0, 0, 0) 180 case glfnDepthRangef: 181 syscall.Syscall6(glDepthRangef.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0) 182 case glfnDepthMask: 183 syscall.Syscall(glDepthMask.Addr(), 1, c.args.a0, 0, 0) 184 case glfnDetachShader: 185 syscall.Syscall(glDetachShader.Addr(), 2, c.args.a0, c.args.a1, 0) 186 case glfnDisable: 187 syscall.Syscall(glDisable.Addr(), 1, c.args.a0, 0, 0) 188 case glfnDisableVertexAttribArray: 189 syscall.Syscall(glDisableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0) 190 case glfnDrawArrays: 191 syscall.Syscall(glDrawArrays.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 192 case glfnDrawElements: 193 syscall.Syscall6(glDrawElements.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 194 case glfnEnable: 195 syscall.Syscall(glEnable.Addr(), 1, c.args.a0, 0, 0) 196 case glfnEnableVertexAttribArray: 197 syscall.Syscall(glEnableVertexAttribArray.Addr(), 1, c.args.a0, 0, 0) 198 case glfnFinish: 199 syscall.Syscall(glFinish.Addr(), 0, 0, 0, 0) 200 case glfnFlush: 201 syscall.Syscall(glFlush.Addr(), 0, 0, 0, 0) 202 case glfnFramebufferRenderbuffer: 203 syscall.Syscall6(glFramebufferRenderbuffer.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 204 case glfnFramebufferTexture2D: 205 syscall.Syscall6(glFramebufferTexture2D.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0) 206 case glfnFrontFace: 207 syscall.Syscall(glFrontFace.Addr(), 1, c.args.a0, 0, 0) 208 case glfnGenBuffer: 209 syscall.Syscall(glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) 210 case glfnGenFramebuffer: 211 syscall.Syscall(glGenFramebuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) 212 case glfnGenRenderbuffer: 213 syscall.Syscall(glGenRenderbuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) 214 case glfnGenTexture: 215 syscall.Syscall(glGenTextures.Addr(), 2, 1, uintptr(unsafe.Pointer(&ret)), 0) 216 case glfnGenerateMipmap: 217 syscall.Syscall(glGenerateMipmap.Addr(), 1, c.args.a0, 0, 0) 218 case glfnGetActiveAttrib: 219 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) 220 case glfnGetActiveUniform: 221 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) 222 case glfnGetAttachedShaders: 223 syscall.Syscall6(glGetAttachedShaders.Addr(), 4, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret)), uintptr(c.parg), 0, 0) 224 case glfnGetAttribLocation: 225 ret, _, _ = syscall.Syscall(glGetAttribLocation.Addr(), 2, c.args.a0, c.args.a1, 0) 226 case glfnGetBooleanv: 227 syscall.Syscall(glGetBooleanv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 228 case glfnGetBufferParameteri: 229 syscall.Syscall(glGetBufferParameteri.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) 230 case glfnGetError: 231 ret, _, _ = syscall.Syscall(glGetError.Addr(), 0, 0, 0, 0) 232 case glfnGetFloatv: 233 syscall.Syscall(glGetFloatv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 234 case glfnGetFramebufferAttachmentParameteriv: 235 syscall.Syscall6(glGetFramebufferAttachmentParameteriv.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, uintptr(unsafe.Pointer(&ret)), 0, 0) 236 case glfnGetIntegerv: 237 syscall.Syscall(glGetIntegerv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 238 case glfnGetProgramInfoLog: 239 syscall.Syscall6(glGetProgramInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 240 case glfnGetProgramiv: 241 syscall.Syscall(glGetProgramiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) 242 case glfnGetRenderbufferParameteriv: 243 syscall.Syscall(glGetRenderbufferParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) 244 case glfnGetShaderInfoLog: 245 syscall.Syscall6(glGetShaderInfoLog.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 246 case glfnGetShaderPrecisionFormat: 247 // c.parg is a [3]int32. The first [2]int32 of the array is one 248 // parameter, the final *int32 is another parameter. 249 syscall.Syscall6(glGetShaderPrecisionFormat.Addr(), 4, c.args.a0, c.args.a1, uintptr(c.parg), uintptr(c.parg)+2*unsafe.Sizeof(uintptr(0)), 0, 0) 250 case glfnGetShaderSource: 251 syscall.Syscall6(glGetShaderSource.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 252 case glfnGetShaderiv: 253 syscall.Syscall(glGetShaderiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(unsafe.Pointer(&ret))) 254 case glfnGetString: 255 ret, _, _ = syscall.Syscall(glGetString.Addr(), 1, c.args.a0, 0, 0) 256 case glfnGetTexParameterfv: 257 syscall.Syscall(glGetTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 258 case glfnGetTexParameteriv: 259 syscall.Syscall(glGetTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 260 case glfnGetUniformLocation: 261 ret, _, _ = syscall.Syscall(glGetUniformLocation.Addr(), 2, c.args.a0, c.args.a1, 0) 262 case glfnGetUniformfv: 263 syscall.Syscall(glGetUniformfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 264 case glfnGetUniformiv: 265 syscall.Syscall(glGetUniformiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 266 case glfnGetVertexAttribfv: 267 syscall.Syscall(glGetVertexAttribfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 268 case glfnGetVertexAttribiv: 269 syscall.Syscall(glGetVertexAttribiv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 270 case glfnHint: 271 syscall.Syscall(glHint.Addr(), 2, c.args.a0, c.args.a1, 0) 272 case glfnIsBuffer: 273 syscall.Syscall(glIsBuffer.Addr(), 1, c.args.a0, 0, 0) 274 case glfnIsEnabled: 275 syscall.Syscall(glIsEnabled.Addr(), 1, c.args.a0, 0, 0) 276 case glfnIsFramebuffer: 277 syscall.Syscall(glIsFramebuffer.Addr(), 1, c.args.a0, 0, 0) 278 case glfnIsProgram: 279 ret, _, _ = syscall.Syscall(glIsProgram.Addr(), 1, c.args.a0, 0, 0) 280 case glfnIsRenderbuffer: 281 syscall.Syscall(glIsRenderbuffer.Addr(), 1, c.args.a0, 0, 0) 282 case glfnIsShader: 283 syscall.Syscall(glIsShader.Addr(), 1, c.args.a0, 0, 0) 284 case glfnIsTexture: 285 syscall.Syscall(glIsTexture.Addr(), 1, c.args.a0, 0, 0) 286 case glfnLineWidth: 287 syscall.Syscall(glLineWidth.Addr(), 1, c.args.a0, 0, 0) 288 case glfnLinkProgram: 289 syscall.Syscall(glLinkProgram.Addr(), 1, c.args.a0, 0, 0) 290 case glfnPixelStorei: 291 syscall.Syscall(glPixelStorei.Addr(), 2, c.args.a0, c.args.a1, 0) 292 case glfnPolygonOffset: 293 syscall.Syscall6(glPolygonOffset.Addr(), 2, c.args.a0, c.args.a1, 0, 0, 0, 0) 294 case glfnReadPixels: 295 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) 296 case glfnReleaseShaderCompiler: 297 syscall.Syscall(glReleaseShaderCompiler.Addr(), 0, 0, 0, 0) 298 case glfnRenderbufferStorage: 299 syscall.Syscall6(glRenderbufferStorage.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 300 case glfnSampleCoverage: 301 syscall.Syscall6(glSampleCoverage.Addr(), 1, c.args.a0, 0, 0, 0, 0, 0) 302 case glfnScissor: 303 syscall.Syscall6(glScissor.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 304 case glfnShaderSource: 305 syscall.Syscall6(glShaderSource.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, 0, 0, 0) 306 case glfnStencilFunc: 307 syscall.Syscall(glStencilFunc.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 308 case glfnStencilFuncSeparate: 309 syscall.Syscall6(glStencilFuncSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 310 case glfnStencilMask: 311 syscall.Syscall(glStencilMask.Addr(), 1, c.args.a0, 0, 0) 312 case glfnStencilMaskSeparate: 313 syscall.Syscall(glStencilMaskSeparate.Addr(), 2, c.args.a0, c.args.a1, 0) 314 case glfnStencilOp: 315 syscall.Syscall(glStencilOp.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 316 case glfnStencilOpSeparate: 317 syscall.Syscall6(glStencilOpSeparate.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 318 case glfnTexImage2D: 319 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)) 320 case glfnTexParameterf: 321 syscall.Syscall6(glTexParameterf.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 322 case glfnTexParameterfv: 323 syscall.Syscall(glTexParameterfv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 324 case glfnTexParameteri: 325 syscall.Syscall(glTexParameteri.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 326 case glfnTexParameteriv: 327 syscall.Syscall(glTexParameteriv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 328 case glfnTexSubImage2D: 329 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)) 330 case glfnUniform1f: 331 syscall.Syscall6(glUniform1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 332 case glfnUniform1fv: 333 syscall.Syscall(glUniform1fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 334 case glfnUniform1i: 335 syscall.Syscall(glUniform1i.Addr(), 2, c.args.a0, c.args.a1, 0) 336 case glfnUniform1iv: 337 syscall.Syscall(glUniform1iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 338 case glfnUniform2f: 339 syscall.Syscall6(glUniform2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 340 case glfnUniform2fv: 341 syscall.Syscall(glUniform2fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 342 case glfnUniform2i: 343 syscall.Syscall(glUniform2i.Addr(), 3, c.args.a0, c.args.a1, c.args.a2) 344 case glfnUniform2iv: 345 syscall.Syscall(glUniform2iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 346 case glfnUniform3f: 347 syscall.Syscall6(glUniform3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 348 case glfnUniform3fv: 349 syscall.Syscall(glUniform3fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 350 case glfnUniform3i: 351 syscall.Syscall6(glUniform3i.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 352 case glfnUniform3iv: 353 syscall.Syscall(glUniform3iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 354 case glfnUniform4f: 355 syscall.Syscall6(glUniform4f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 356 case glfnUniform4fv: 357 syscall.Syscall(glUniform4fv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 358 case glfnUniform4i: 359 syscall.Syscall6(glUniform4i.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, 0) 360 case glfnUniform4iv: 361 syscall.Syscall(glUniform4iv.Addr(), 3, c.args.a0, c.args.a1, uintptr(c.parg)) 362 case glfnUniformMatrix2fv: 363 syscall.Syscall6(glUniformMatrix2fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 364 case glfnUniformMatrix3fv: 365 syscall.Syscall6(glUniformMatrix3fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 366 case glfnUniformMatrix4fv: 367 syscall.Syscall6(glUniformMatrix4fv.Addr(), 4, c.args.a0, c.args.a1, 0, uintptr(c.parg), 0, 0) 368 case glfnUseProgram: 369 syscall.Syscall(glUseProgram.Addr(), 1, c.args.a0, 0, 0) 370 case glfnValidateProgram: 371 syscall.Syscall(glValidateProgram.Addr(), 1, c.args.a0, 0, 0) 372 case glfnVertexAttrib1f: 373 syscall.Syscall6(glVertexAttrib1f.Addr(), 2, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 374 case glfnVertexAttrib1fv: 375 syscall.Syscall(glVertexAttrib1fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 376 case glfnVertexAttrib2f: 377 syscall.Syscall6(glVertexAttrib2f.Addr(), 3, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 378 case glfnVertexAttrib2fv: 379 syscall.Syscall(glVertexAttrib2fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 380 case glfnVertexAttrib3f: 381 syscall.Syscall6(glVertexAttrib3f.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 382 case glfnVertexAttrib3fv: 383 syscall.Syscall(glVertexAttrib3fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 384 case glfnVertexAttrib4f: 385 syscall.Syscall6(glVertexAttrib3f.Addr(), 5, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 386 case glfnVertexAttrib4fv: 387 syscall.Syscall(glVertexAttrib4fv.Addr(), 2, c.args.a0, uintptr(c.parg), 0) 388 case glfnVertexAttribPointer: 389 syscall.Syscall6(glVertexAttribPointer.Addr(), 6, c.args.a0, c.args.a1, c.args.a2, c.args.a3, c.args.a4, c.args.a5) 390 case glfnViewport: 391 syscall.Syscall6(glViewport.Addr(), 4, c.args.a0, c.args.a1, c.args.a2, c.args.a3, 0, 0) 392 default: 393 panic("unknown GL function") 394 } 395 396 return ret 397 } 398 399 // Exported libraries for a Windows GUI driver. 400 // 401 // LibEGL is not used directly by the gl package, but is needed by any 402 // driver hoping to use OpenGL ES. 403 var ( 404 LibGLESv2 = syscall.NewLazyDLL("libglesv2.dll") 405 LibEGL = syscall.NewLazyDLL("libegl.dll") 406 ) 407 408 var ( 409 libGLESv2 = LibGLESv2 410 glActiveTexture = libGLESv2.NewProc("glActiveTexture") 411 glAttachShader = libGLESv2.NewProc("glAttachShader") 412 glBindAttribLocation = libGLESv2.NewProc("glBindAttribLocation") 413 glBindBuffer = libGLESv2.NewProc("glBindBuffer") 414 glBindFramebuffer = libGLESv2.NewProc("glBindFramebuffer") 415 glBindRenderbuffer = libGLESv2.NewProc("glBindRenderbuffer") 416 glBindTexture = libGLESv2.NewProc("glBindTexture") 417 glBlendColor = libGLESv2.NewProc("glBlendColor") 418 glBlendEquation = libGLESv2.NewProc("glBlendEquation") 419 glBlendEquationSeparate = libGLESv2.NewProc("glBlendEquationSeparate") 420 glBlendFunc = libGLESv2.NewProc("glBlendFunc") 421 glBlendFuncSeparate = libGLESv2.NewProc("glBlendFuncSeparate") 422 glBufferData = libGLESv2.NewProc("glBufferData") 423 glBufferSubData = libGLESv2.NewProc("glBufferSubData") 424 glCheckFramebufferStatus = libGLESv2.NewProc("glCheckFramebufferStatus") 425 glClear = libGLESv2.NewProc("glClear") 426 glClearColor = libGLESv2.NewProc("glClearColor") 427 glClearDepthf = libGLESv2.NewProc("glClearDepthf") 428 glClearStencil = libGLESv2.NewProc("glClearStencil") 429 glColorMask = libGLESv2.NewProc("glColorMask") 430 glCompileShader = libGLESv2.NewProc("glCompileShader") 431 glCompressedTexImage2D = libGLESv2.NewProc("glCompressedTexImage2D") 432 glCompressedTexSubImage2D = libGLESv2.NewProc("glCompressedTexSubImage2D") 433 glCopyTexImage2D = libGLESv2.NewProc("glCopyTexImage2D") 434 glCopyTexSubImage2D = libGLESv2.NewProc("glCopyTexSubImage2D") 435 glCreateProgram = libGLESv2.NewProc("glCreateProgram") 436 glCreateShader = libGLESv2.NewProc("glCreateShader") 437 glCullFace = libGLESv2.NewProc("glCullFace") 438 glDeleteBuffers = libGLESv2.NewProc("glDeleteBuffers") 439 glDeleteFramebuffers = libGLESv2.NewProc("glDeleteFramebuffers") 440 glDeleteProgram = libGLESv2.NewProc("glDeleteProgram") 441 glDeleteRenderbuffers = libGLESv2.NewProc("glDeleteRenderbuffers") 442 glDeleteShader = libGLESv2.NewProc("glDeleteShader") 443 glDeleteTextures = libGLESv2.NewProc("glDeleteTextures") 444 glDepthFunc = libGLESv2.NewProc("glDepthFunc") 445 glDepthRangef = libGLESv2.NewProc("glDepthRangef") 446 glDepthMask = libGLESv2.NewProc("glDepthMask") 447 glDetachShader = libGLESv2.NewProc("glDetachShader") 448 glDisable = libGLESv2.NewProc("glDisable") 449 glDisableVertexAttribArray = libGLESv2.NewProc("glDisableVertexAttribArray") 450 glDrawArrays = libGLESv2.NewProc("glDrawArrays") 451 glDrawElements = libGLESv2.NewProc("glDrawElements") 452 glEnable = libGLESv2.NewProc("glEnable") 453 glEnableVertexAttribArray = libGLESv2.NewProc("glEnableVertexAttribArray") 454 glFinish = libGLESv2.NewProc("glFinish") 455 glFlush = libGLESv2.NewProc("glFlush") 456 glFramebufferRenderbuffer = libGLESv2.NewProc("glFramebufferRenderbuffer") 457 glFramebufferTexture2D = libGLESv2.NewProc("glFramebufferTexture2D") 458 glFrontFace = libGLESv2.NewProc("glFrontFace") 459 glGenBuffers = libGLESv2.NewProc("glGenBuffers") 460 glGenFramebuffers = libGLESv2.NewProc("glGenFramebuffers") 461 glGenRenderbuffers = libGLESv2.NewProc("glGenRenderbuffers") 462 glGenTextures = libGLESv2.NewProc("glGenTextures") 463 glGenerateMipmap = libGLESv2.NewProc("glGenerateMipmap") 464 glGetActiveAttrib = libGLESv2.NewProc("glGetActiveAttrib") 465 glGetActiveUniform = libGLESv2.NewProc("glGetActiveUniform") 466 glGetAttachedShaders = libGLESv2.NewProc("glGetAttachedShaders") 467 glGetAttribLocation = libGLESv2.NewProc("glGetAttribLocation") 468 glGetBooleanv = libGLESv2.NewProc("glGetBooleanv") 469 glGetBufferParameteri = libGLESv2.NewProc("glGetBufferParameteri") 470 glGetError = libGLESv2.NewProc("glGetError") 471 glGetFloatv = libGLESv2.NewProc("glGetFloatv") 472 glGetFramebufferAttachmentParameteriv = libGLESv2.NewProc("glGetFramebufferAttachmentParameteriv") 473 glGetIntegerv = libGLESv2.NewProc("glGetIntegerv") 474 glGetProgramInfoLog = libGLESv2.NewProc("glGetProgramInfoLog") 475 glGetProgramiv = libGLESv2.NewProc("glGetProgramiv") 476 glGetRenderbufferParameteriv = libGLESv2.NewProc("glGetRenderbufferParameteriv") 477 glGetShaderInfoLog = libGLESv2.NewProc("glGetShaderInfoLog") 478 glGetShaderPrecisionFormat = libGLESv2.NewProc("glGetShaderPrecisionFormat") 479 glGetShaderSource = libGLESv2.NewProc("glGetShaderSource") 480 glGetShaderiv = libGLESv2.NewProc("glGetShaderiv") 481 glGetString = libGLESv2.NewProc("glGetString") 482 glGetTexParameterfv = libGLESv2.NewProc("glGetTexParameterfv") 483 glGetTexParameteriv = libGLESv2.NewProc("glGetTexParameteriv") 484 glGetUniformLocation = libGLESv2.NewProc("glGetUniformLocation") 485 glGetUniformfv = libGLESv2.NewProc("glGetUniformfv") 486 glGetUniformiv = libGLESv2.NewProc("glGetUniformiv") 487 glGetVertexAttribfv = libGLESv2.NewProc("glGetVertexAttribfv") 488 glGetVertexAttribiv = libGLESv2.NewProc("glGetVertexAttribiv") 489 glHint = libGLESv2.NewProc("glHint") 490 glIsBuffer = libGLESv2.NewProc("glIsBuffer") 491 glIsEnabled = libGLESv2.NewProc("glIsEnabled") 492 glIsFramebuffer = libGLESv2.NewProc("glIsFramebuffer") 493 glIsProgram = libGLESv2.NewProc("glIsProgram") 494 glIsRenderbuffer = libGLESv2.NewProc("glIsRenderbuffer") 495 glIsShader = libGLESv2.NewProc("glIsShader") 496 glIsTexture = libGLESv2.NewProc("glIsTexture") 497 glLineWidth = libGLESv2.NewProc("glLineWidth") 498 glLinkProgram = libGLESv2.NewProc("glLinkProgram") 499 glPixelStorei = libGLESv2.NewProc("glPixelStorei") 500 glPolygonOffset = libGLESv2.NewProc("glPolygonOffset") 501 glReadPixels = libGLESv2.NewProc("glReadPixels") 502 glReleaseShaderCompiler = libGLESv2.NewProc("glReleaseShaderCompiler") 503 glRenderbufferStorage = libGLESv2.NewProc("glRenderbufferStorage") 504 glSampleCoverage = libGLESv2.NewProc("glSampleCoverage") 505 glScissor = libGLESv2.NewProc("glScissor") 506 glShaderSource = libGLESv2.NewProc("glShaderSource") 507 glStencilFunc = libGLESv2.NewProc("glStencilFunc") 508 glStencilFuncSeparate = libGLESv2.NewProc("glStencilFuncSeparate") 509 glStencilMask = libGLESv2.NewProc("glStencilMask") 510 glStencilMaskSeparate = libGLESv2.NewProc("glStencilMaskSeparate") 511 glStencilOp = libGLESv2.NewProc("glStencilOp") 512 glStencilOpSeparate = libGLESv2.NewProc("glStencilOpSeparate") 513 glTexImage2D = libGLESv2.NewProc("glTexImage2D") 514 glTexParameterf = libGLESv2.NewProc("glTexParameterf") 515 glTexParameterfv = libGLESv2.NewProc("glTexParameterfv") 516 glTexParameteri = libGLESv2.NewProc("glTexParameteri") 517 glTexParameteriv = libGLESv2.NewProc("glTexParameteriv") 518 glTexSubImage2D = libGLESv2.NewProc("glTexSubImage2D") 519 glUniform1f = libGLESv2.NewProc("glUniform1f") 520 glUniform1fv = libGLESv2.NewProc("glUniform1fv") 521 glUniform1i = libGLESv2.NewProc("glUniform1i") 522 glUniform1iv = libGLESv2.NewProc("glUniform1iv") 523 glUniform2f = libGLESv2.NewProc("glUniform2f") 524 glUniform2fv = libGLESv2.NewProc("glUniform2fv") 525 glUniform2i = libGLESv2.NewProc("glUniform2i") 526 glUniform2iv = libGLESv2.NewProc("glUniform2iv") 527 glUniform3f = libGLESv2.NewProc("glUniform3f") 528 glUniform3fv = libGLESv2.NewProc("glUniform3fv") 529 glUniform3i = libGLESv2.NewProc("glUniform3i") 530 glUniform3iv = libGLESv2.NewProc("glUniform3iv") 531 glUniform4f = libGLESv2.NewProc("glUniform4f") 532 glUniform4fv = libGLESv2.NewProc("glUniform4fv") 533 glUniform4i = libGLESv2.NewProc("glUniform4i") 534 glUniform4iv = libGLESv2.NewProc("glUniform4iv") 535 glUniformMatrix2fv = libGLESv2.NewProc("glUniformMatrix2fv") 536 glUniformMatrix3fv = libGLESv2.NewProc("glUniformMatrix3fv") 537 glUniformMatrix4fv = libGLESv2.NewProc("glUniformMatrix4fv") 538 glUseProgram = libGLESv2.NewProc("glUseProgram") 539 glValidateProgram = libGLESv2.NewProc("glValidateProgram") 540 glVertexAttrib1f = libGLESv2.NewProc("glVertexAttrib1f") 541 glVertexAttrib1fv = libGLESv2.NewProc("glVertexAttrib1fv") 542 glVertexAttrib2f = libGLESv2.NewProc("glVertexAttrib2f") 543 glVertexAttrib2fv = libGLESv2.NewProc("glVertexAttrib2fv") 544 glVertexAttrib3f = libGLESv2.NewProc("glVertexAttrib3f") 545 glVertexAttrib3fv = libGLESv2.NewProc("glVertexAttrib3fv") 546 glVertexAttrib4f = libGLESv2.NewProc("glVertexAttrib4f") 547 glVertexAttrib4fv = libGLESv2.NewProc("glVertexAttrib4fv") 548 glVertexAttribPointer = libGLESv2.NewProc("glVertexAttribPointer") 549 glViewport = libGLESv2.NewProc("glViewport") 550 )