work_windows.go 30 KB

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