gl.go 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853
  1. // Copyright 2014 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. //go:build (darwin || linux || openbsd || windows) && !gldebug
  5. // +build darwin linux openbsd windows
  6. // +build !gldebug
  7. package gl
  8. // TODO(crawshaw): should functions on specific types become methods? E.g.
  9. // func (t Texture) Bind(target Enum)
  10. // this seems natural in Go, but moves us slightly
  11. // further away from the underlying OpenGL spec.
  12. import (
  13. "math"
  14. "unsafe"
  15. )
  16. func (ctx *context) ActiveTexture(texture Enum) {
  17. ctx.enqueue(call{
  18. args: fnargs{
  19. fn: glfnActiveTexture,
  20. a0: texture.c(),
  21. },
  22. })
  23. }
  24. func (ctx *context) AttachShader(p Program, s Shader) {
  25. ctx.enqueue(call{
  26. args: fnargs{
  27. fn: glfnAttachShader,
  28. a0: p.c(),
  29. a1: s.c(),
  30. },
  31. })
  32. }
  33. func (ctx *context) BindAttribLocation(p Program, a Attrib, name string) {
  34. s, free := ctx.cString(name)
  35. defer free()
  36. ctx.enqueue(call{
  37. args: fnargs{
  38. fn: glfnBindAttribLocation,
  39. a0: p.c(),
  40. a1: a.c(),
  41. a2: s,
  42. },
  43. blocking: true,
  44. })
  45. }
  46. func (ctx *context) BindBuffer(target Enum, b Buffer) {
  47. ctx.enqueue(call{
  48. args: fnargs{
  49. fn: glfnBindBuffer,
  50. a0: target.c(),
  51. a1: b.c(),
  52. },
  53. })
  54. }
  55. func (ctx *context) BindFramebuffer(target Enum, fb Framebuffer) {
  56. ctx.enqueue(call{
  57. args: fnargs{
  58. fn: glfnBindFramebuffer,
  59. a0: target.c(),
  60. a1: fb.c(),
  61. },
  62. })
  63. }
  64. func (ctx *context) BindRenderbuffer(target Enum, rb Renderbuffer) {
  65. ctx.enqueue(call{
  66. args: fnargs{
  67. fn: glfnBindRenderbuffer,
  68. a0: target.c(),
  69. a1: rb.c(),
  70. },
  71. })
  72. }
  73. func (ctx *context) BindTexture(target Enum, t Texture) {
  74. ctx.enqueue(call{
  75. args: fnargs{
  76. fn: glfnBindTexture,
  77. a0: target.c(),
  78. a1: t.c(),
  79. },
  80. })
  81. }
  82. func (ctx *context) BindVertexArray(va VertexArray) {
  83. ctx.enqueue(call{
  84. args: fnargs{
  85. fn: glfnBindVertexArray,
  86. a0: va.c(),
  87. },
  88. })
  89. }
  90. func (ctx *context) BlendColor(red, green, blue, alpha float32) {
  91. ctx.enqueue(call{
  92. args: fnargs{
  93. fn: glfnBlendColor,
  94. a0: uintptr(math.Float32bits(red)),
  95. a1: uintptr(math.Float32bits(green)),
  96. a2: uintptr(math.Float32bits(blue)),
  97. a3: uintptr(math.Float32bits(alpha)),
  98. },
  99. })
  100. }
  101. func (ctx *context) BlendEquation(mode Enum) {
  102. ctx.enqueue(call{
  103. args: fnargs{
  104. fn: glfnBlendEquation,
  105. a0: mode.c(),
  106. },
  107. })
  108. }
  109. func (ctx *context) BlendEquationSeparate(modeRGB, modeAlpha Enum) {
  110. ctx.enqueue(call{
  111. args: fnargs{
  112. fn: glfnBlendEquationSeparate,
  113. a0: modeRGB.c(),
  114. a1: modeAlpha.c(),
  115. },
  116. })
  117. }
  118. func (ctx *context) BlendFunc(sfactor, dfactor Enum) {
  119. ctx.enqueue(call{
  120. args: fnargs{
  121. fn: glfnBlendFunc,
  122. a0: sfactor.c(),
  123. a1: dfactor.c(),
  124. },
  125. })
  126. }
  127. func (ctx *context) BlendFuncSeparate(sfactorRGB, dfactorRGB, sfactorAlpha, dfactorAlpha Enum) {
  128. ctx.enqueue(call{
  129. args: fnargs{
  130. fn: glfnBlendFuncSeparate,
  131. a0: sfactorRGB.c(),
  132. a1: dfactorRGB.c(),
  133. a2: sfactorAlpha.c(),
  134. a3: dfactorAlpha.c(),
  135. },
  136. })
  137. }
  138. func (ctx *context) BufferData(target Enum, src []byte, usage Enum) {
  139. parg := unsafe.Pointer(nil)
  140. if len(src) > 0 {
  141. parg = unsafe.Pointer(&src[0])
  142. }
  143. ctx.enqueue(call{
  144. args: fnargs{
  145. fn: glfnBufferData,
  146. a0: target.c(),
  147. a1: uintptr(len(src)),
  148. a2: usage.c(),
  149. },
  150. parg: parg,
  151. blocking: true,
  152. })
  153. }
  154. func (ctx *context) BufferInit(target Enum, size int, usage Enum) {
  155. ctx.enqueue(call{
  156. args: fnargs{
  157. fn: glfnBufferData,
  158. a0: target.c(),
  159. a1: uintptr(size),
  160. a2: usage.c(),
  161. },
  162. parg: unsafe.Pointer(nil),
  163. })
  164. }
  165. func (ctx *context) BufferSubData(target Enum, offset int, data []byte) {
  166. ctx.enqueue(call{
  167. args: fnargs{
  168. fn: glfnBufferSubData,
  169. a0: target.c(),
  170. a1: uintptr(offset),
  171. a2: uintptr(len(data)),
  172. },
  173. parg: unsafe.Pointer(&data[0]),
  174. blocking: true,
  175. })
  176. }
  177. func (ctx *context) CheckFramebufferStatus(target Enum) Enum {
  178. return Enum(ctx.enqueue(call{
  179. args: fnargs{
  180. fn: glfnCheckFramebufferStatus,
  181. a0: target.c(),
  182. },
  183. blocking: true,
  184. }))
  185. }
  186. func (ctx *context) Clear(mask Enum) {
  187. ctx.enqueue(call{
  188. args: fnargs{
  189. fn: glfnClear,
  190. a0: uintptr(mask),
  191. },
  192. })
  193. }
  194. func (ctx *context) ClearColor(red, green, blue, alpha float32) {
  195. ctx.enqueue(call{
  196. args: fnargs{
  197. fn: glfnClearColor,
  198. a0: uintptr(math.Float32bits(red)),
  199. a1: uintptr(math.Float32bits(green)),
  200. a2: uintptr(math.Float32bits(blue)),
  201. a3: uintptr(math.Float32bits(alpha)),
  202. },
  203. })
  204. }
  205. func (ctx *context) ClearDepthf(d float32) {
  206. ctx.enqueue(call{
  207. args: fnargs{
  208. fn: glfnClearDepthf,
  209. a0: uintptr(math.Float32bits(d)),
  210. },
  211. })
  212. }
  213. func (ctx *context) ClearStencil(s int) {
  214. ctx.enqueue(call{
  215. args: fnargs{
  216. fn: glfnClearStencil,
  217. a0: uintptr(s),
  218. },
  219. })
  220. }
  221. func (ctx *context) ColorMask(red, green, blue, alpha bool) {
  222. ctx.enqueue(call{
  223. args: fnargs{
  224. fn: glfnColorMask,
  225. a0: glBoolean(red),
  226. a1: glBoolean(green),
  227. a2: glBoolean(blue),
  228. a3: glBoolean(alpha),
  229. },
  230. })
  231. }
  232. func (ctx *context) CompileShader(s Shader) {
  233. ctx.enqueue(call{
  234. args: fnargs{
  235. fn: glfnCompileShader,
  236. a0: s.c(),
  237. },
  238. })
  239. }
  240. func (ctx *context) CompressedTexImage2D(target Enum, level int, internalformat Enum, width, height, border int, data []byte) {
  241. ctx.enqueue(call{
  242. args: fnargs{
  243. fn: glfnCompressedTexImage2D,
  244. a0: target.c(),
  245. a1: uintptr(level),
  246. a2: internalformat.c(),
  247. a3: uintptr(width),
  248. a4: uintptr(height),
  249. a5: uintptr(border),
  250. a6: uintptr(len(data)),
  251. },
  252. parg: unsafe.Pointer(&data[0]),
  253. blocking: true,
  254. })
  255. }
  256. func (ctx *context) CompressedTexSubImage2D(target Enum, level, xoffset, yoffset, width, height int, format Enum, data []byte) {
  257. ctx.enqueue(call{
  258. args: fnargs{
  259. fn: glfnCompressedTexSubImage2D,
  260. a0: target.c(),
  261. a1: uintptr(level),
  262. a2: uintptr(xoffset),
  263. a3: uintptr(yoffset),
  264. a4: uintptr(width),
  265. a5: uintptr(height),
  266. a6: format.c(),
  267. a7: uintptr(len(data)),
  268. },
  269. parg: unsafe.Pointer(&data[0]),
  270. blocking: true,
  271. })
  272. }
  273. func (ctx *context) CopyTexImage2D(target Enum, level int, internalformat Enum, x, y, width, height, border int) {
  274. ctx.enqueue(call{
  275. args: fnargs{
  276. fn: glfnCopyTexImage2D,
  277. a0: target.c(),
  278. a1: uintptr(level),
  279. a2: internalformat.c(),
  280. a3: uintptr(x),
  281. a4: uintptr(y),
  282. a5: uintptr(width),
  283. a6: uintptr(height),
  284. a7: uintptr(border),
  285. },
  286. })
  287. }
  288. func (ctx *context) CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) {
  289. ctx.enqueue(call{
  290. args: fnargs{
  291. fn: glfnCopyTexSubImage2D,
  292. a0: target.c(),
  293. a1: uintptr(level),
  294. a2: uintptr(xoffset),
  295. a3: uintptr(yoffset),
  296. a4: uintptr(x),
  297. a5: uintptr(y),
  298. a6: uintptr(width),
  299. a7: uintptr(height),
  300. },
  301. })
  302. }
  303. func (ctx *context) CreateBuffer() Buffer {
  304. return Buffer{Value: uint32(ctx.enqueue(call{
  305. args: fnargs{
  306. fn: glfnGenBuffer,
  307. },
  308. blocking: true,
  309. }))}
  310. }
  311. func (ctx *context) CreateFramebuffer() Framebuffer {
  312. return Framebuffer{Value: uint32(ctx.enqueue(call{
  313. args: fnargs{
  314. fn: glfnGenFramebuffer,
  315. },
  316. blocking: true,
  317. }))}
  318. }
  319. func (ctx *context) CreateProgram() Program {
  320. return Program{
  321. Init: true,
  322. Value: uint32(ctx.enqueue(call{
  323. args: fnargs{
  324. fn: glfnCreateProgram,
  325. },
  326. blocking: true,
  327. },
  328. ))}
  329. }
  330. func (ctx *context) CreateRenderbuffer() Renderbuffer {
  331. return Renderbuffer{Value: uint32(ctx.enqueue(call{
  332. args: fnargs{
  333. fn: glfnGenRenderbuffer,
  334. },
  335. blocking: true,
  336. }))}
  337. }
  338. func (ctx *context) CreateShader(ty Enum) Shader {
  339. return Shader{Value: uint32(ctx.enqueue(call{
  340. args: fnargs{
  341. fn: glfnCreateShader,
  342. a0: uintptr(ty),
  343. },
  344. blocking: true,
  345. }))}
  346. }
  347. func (ctx *context) CreateTexture() Texture {
  348. return Texture{Value: uint32(ctx.enqueue(call{
  349. args: fnargs{
  350. fn: glfnGenTexture,
  351. },
  352. blocking: true,
  353. }))}
  354. }
  355. func (ctx *context) CreateVertexArray() VertexArray {
  356. return VertexArray{Value: uint32(ctx.enqueue(call{
  357. args: fnargs{
  358. fn: glfnGenVertexArray,
  359. },
  360. blocking: true,
  361. }))}
  362. }
  363. func (ctx *context) CullFace(mode Enum) {
  364. ctx.enqueue(call{
  365. args: fnargs{
  366. fn: glfnCullFace,
  367. a0: mode.c(),
  368. },
  369. })
  370. }
  371. func (ctx *context) DeleteBuffer(v Buffer) {
  372. ctx.enqueue(call{
  373. args: fnargs{
  374. fn: glfnDeleteBuffer,
  375. a0: v.c(),
  376. },
  377. })
  378. }
  379. func (ctx *context) DeleteFramebuffer(v Framebuffer) {
  380. ctx.enqueue(call{
  381. args: fnargs{
  382. fn: glfnDeleteFramebuffer,
  383. a0: v.c(),
  384. },
  385. })
  386. }
  387. func (ctx *context) DeleteProgram(p Program) {
  388. ctx.enqueue(call{
  389. args: fnargs{
  390. fn: glfnDeleteProgram,
  391. a0: p.c(),
  392. },
  393. })
  394. }
  395. func (ctx *context) DeleteRenderbuffer(v Renderbuffer) {
  396. ctx.enqueue(call{
  397. args: fnargs{
  398. fn: glfnDeleteRenderbuffer,
  399. a0: v.c(),
  400. },
  401. })
  402. }
  403. func (ctx *context) DeleteShader(s Shader) {
  404. ctx.enqueue(call{
  405. args: fnargs{
  406. fn: glfnDeleteShader,
  407. a0: s.c(),
  408. },
  409. })
  410. }
  411. func (ctx *context) DeleteTexture(v Texture) {
  412. ctx.enqueue(call{
  413. args: fnargs{
  414. fn: glfnDeleteTexture,
  415. a0: v.c(),
  416. },
  417. })
  418. }
  419. func (ctx *context) DeleteVertexArray(v VertexArray) {
  420. ctx.enqueue(call{
  421. args: fnargs{
  422. fn: glfnDeleteVertexArray,
  423. a0: v.c(),
  424. },
  425. })
  426. }
  427. func (ctx *context) DepthFunc(fn Enum) {
  428. ctx.enqueue(call{
  429. args: fnargs{
  430. fn: glfnDepthFunc,
  431. a0: fn.c(),
  432. },
  433. })
  434. }
  435. func (ctx *context) DepthMask(flag bool) {
  436. ctx.enqueue(call{
  437. args: fnargs{
  438. fn: glfnDepthMask,
  439. a0: glBoolean(flag),
  440. },
  441. })
  442. }
  443. func (ctx *context) DepthRangef(n, f float32) {
  444. ctx.enqueue(call{
  445. args: fnargs{
  446. fn: glfnDepthRangef,
  447. a0: uintptr(math.Float32bits(n)),
  448. a1: uintptr(math.Float32bits(f)),
  449. },
  450. })
  451. }
  452. func (ctx *context) DetachShader(p Program, s Shader) {
  453. ctx.enqueue(call{
  454. args: fnargs{
  455. fn: glfnDetachShader,
  456. a0: p.c(),
  457. a1: s.c(),
  458. },
  459. })
  460. }
  461. func (ctx *context) Disable(cap Enum) {
  462. ctx.enqueue(call{
  463. args: fnargs{
  464. fn: glfnDisable,
  465. a0: cap.c(),
  466. },
  467. })
  468. }
  469. func (ctx *context) DisableVertexAttribArray(a Attrib) {
  470. ctx.enqueue(call{
  471. args: fnargs{
  472. fn: glfnDisableVertexAttribArray,
  473. a0: a.c(),
  474. },
  475. })
  476. }
  477. func (ctx *context) DrawArrays(mode Enum, first, count int) {
  478. ctx.enqueue(call{
  479. args: fnargs{
  480. fn: glfnDrawArrays,
  481. a0: mode.c(),
  482. a1: uintptr(first),
  483. a2: uintptr(count),
  484. },
  485. })
  486. }
  487. func (ctx *context) DrawElements(mode Enum, count int, ty Enum, offset int) {
  488. ctx.enqueue(call{
  489. args: fnargs{
  490. fn: glfnDrawElements,
  491. a0: mode.c(),
  492. a1: uintptr(count),
  493. a2: ty.c(),
  494. a3: uintptr(offset),
  495. },
  496. })
  497. }
  498. func (ctx *context) Enable(cap Enum) {
  499. ctx.enqueue(call{
  500. args: fnargs{
  501. fn: glfnEnable,
  502. a0: cap.c(),
  503. },
  504. })
  505. }
  506. func (ctx *context) EnableVertexAttribArray(a Attrib) {
  507. ctx.enqueue(call{
  508. args: fnargs{
  509. fn: glfnEnableVertexAttribArray,
  510. a0: a.c(),
  511. },
  512. })
  513. }
  514. func (ctx *context) Finish() {
  515. ctx.enqueue(call{
  516. args: fnargs{
  517. fn: glfnFinish,
  518. },
  519. blocking: true,
  520. })
  521. }
  522. func (ctx *context) Flush() {
  523. ctx.enqueue(call{
  524. args: fnargs{
  525. fn: glfnFlush,
  526. },
  527. blocking: true,
  528. })
  529. }
  530. func (ctx *context) FramebufferRenderbuffer(target, attachment, rbTarget Enum, rb Renderbuffer) {
  531. ctx.enqueue(call{
  532. args: fnargs{
  533. fn: glfnFramebufferRenderbuffer,
  534. a0: target.c(),
  535. a1: attachment.c(),
  536. a2: rbTarget.c(),
  537. a3: rb.c(),
  538. },
  539. })
  540. }
  541. func (ctx *context) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
  542. ctx.enqueue(call{
  543. args: fnargs{
  544. fn: glfnFramebufferTexture2D,
  545. a0: target.c(),
  546. a1: attachment.c(),
  547. a2: texTarget.c(),
  548. a3: t.c(),
  549. a4: uintptr(level),
  550. },
  551. })
  552. }
  553. func (ctx *context) FrontFace(mode Enum) {
  554. ctx.enqueue(call{
  555. args: fnargs{
  556. fn: glfnFrontFace,
  557. a0: mode.c(),
  558. },
  559. })
  560. }
  561. func (ctx *context) GenerateMipmap(target Enum) {
  562. ctx.enqueue(call{
  563. args: fnargs{
  564. fn: glfnGenerateMipmap,
  565. a0: target.c(),
  566. },
  567. })
  568. }
  569. func (ctx *context) GetActiveAttrib(p Program, index uint32) (name string, size int, ty Enum) {
  570. bufSize := ctx.GetProgrami(p, ACTIVE_ATTRIBUTE_MAX_LENGTH)
  571. buf := make([]byte, bufSize)
  572. var cType int
  573. cSize := ctx.enqueue(call{
  574. args: fnargs{
  575. fn: glfnGetActiveAttrib,
  576. a0: p.c(),
  577. a1: uintptr(index),
  578. a2: uintptr(bufSize),
  579. a3: uintptr(unsafe.Pointer(&cType)), // TODO(crawshaw): not safe for a moving collector
  580. },
  581. parg: unsafe.Pointer(&buf[0]),
  582. blocking: true,
  583. })
  584. return goString(buf), int(cSize), Enum(cType)
  585. }
  586. func (ctx *context) GetActiveUniform(p Program, index uint32) (name string, size int, ty Enum) {
  587. bufSize := ctx.GetProgrami(p, ACTIVE_UNIFORM_MAX_LENGTH)
  588. buf := make([]byte, bufSize+8) // extra space for cType
  589. var cType int
  590. cSize := ctx.enqueue(call{
  591. args: fnargs{
  592. fn: glfnGetActiveUniform,
  593. a0: p.c(),
  594. a1: uintptr(index),
  595. a2: uintptr(bufSize),
  596. a3: uintptr(unsafe.Pointer(&cType)), // TODO(crawshaw): not safe for a moving collector
  597. },
  598. parg: unsafe.Pointer(&buf[0]),
  599. blocking: true,
  600. })
  601. return goString(buf), int(cSize), Enum(cType)
  602. }
  603. func (ctx *context) GetAttachedShaders(p Program) []Shader {
  604. shadersLen := ctx.GetProgrami(p, ATTACHED_SHADERS)
  605. if shadersLen == 0 {
  606. return nil
  607. }
  608. buf := make([]uint32, shadersLen)
  609. n := int(ctx.enqueue(call{
  610. args: fnargs{
  611. fn: glfnGetAttachedShaders,
  612. a0: p.c(),
  613. a1: uintptr(shadersLen),
  614. },
  615. parg: unsafe.Pointer(&buf[0]),
  616. blocking: true,
  617. }))
  618. buf = buf[:int(n)]
  619. shaders := make([]Shader, len(buf))
  620. for i, s := range buf {
  621. shaders[i] = Shader{Value: uint32(s)}
  622. }
  623. return shaders
  624. }
  625. func (ctx *context) GetAttribLocation(p Program, name string) Attrib {
  626. s, free := ctx.cString(name)
  627. defer free()
  628. return Attrib{Value: uint(ctx.enqueue(call{
  629. args: fnargs{
  630. fn: glfnGetAttribLocation,
  631. a0: p.c(),
  632. a1: s,
  633. },
  634. blocking: true,
  635. }))}
  636. }
  637. func (ctx *context) GetBooleanv(dst []bool, pname Enum) {
  638. buf := make([]int32, len(dst))
  639. ctx.enqueue(call{
  640. args: fnargs{
  641. fn: glfnGetBooleanv,
  642. a0: pname.c(),
  643. },
  644. parg: unsafe.Pointer(&buf[0]),
  645. blocking: true,
  646. })
  647. for i, v := range buf {
  648. dst[i] = v != 0
  649. }
  650. }
  651. func (ctx *context) GetFloatv(dst []float32, pname Enum) {
  652. ctx.enqueue(call{
  653. args: fnargs{
  654. fn: glfnGetFloatv,
  655. a0: pname.c(),
  656. },
  657. parg: unsafe.Pointer(&dst[0]),
  658. blocking: true,
  659. })
  660. }
  661. func (ctx *context) GetIntegerv(dst []int32, pname Enum) {
  662. ctx.enqueue(call{
  663. args: fnargs{
  664. fn: glfnGetIntegerv,
  665. a0: pname.c(),
  666. },
  667. parg: unsafe.Pointer(&dst[0]),
  668. blocking: true,
  669. })
  670. }
  671. func (ctx *context) GetInteger(pname Enum) int {
  672. var v [1]int32
  673. ctx.GetIntegerv(v[:], pname)
  674. return int(v[0])
  675. }
  676. func (ctx *context) GetBufferParameteri(target, value Enum) int {
  677. return int(ctx.enqueue(call{
  678. args: fnargs{
  679. fn: glfnGetBufferParameteri,
  680. a0: target.c(),
  681. a1: value.c(),
  682. },
  683. blocking: true,
  684. }))
  685. }
  686. func (ctx *context) GetError() Enum {
  687. return Enum(ctx.enqueue(call{
  688. args: fnargs{
  689. fn: glfnGetError,
  690. },
  691. blocking: true,
  692. }))
  693. }
  694. func (ctx *context) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
  695. return int(ctx.enqueue(call{
  696. args: fnargs{
  697. fn: glfnGetFramebufferAttachmentParameteriv,
  698. a0: target.c(),
  699. a1: attachment.c(),
  700. a2: pname.c(),
  701. },
  702. blocking: true,
  703. }))
  704. }
  705. func (ctx *context) GetProgrami(p Program, pname Enum) int {
  706. return int(ctx.enqueue(call{
  707. args: fnargs{
  708. fn: glfnGetProgramiv,
  709. a0: p.c(),
  710. a1: pname.c(),
  711. },
  712. blocking: true,
  713. }))
  714. }
  715. func (ctx *context) GetProgramInfoLog(p Program) string {
  716. infoLen := ctx.GetProgrami(p, INFO_LOG_LENGTH)
  717. if infoLen == 0 {
  718. return ""
  719. }
  720. buf := make([]byte, infoLen)
  721. ctx.enqueue(call{
  722. args: fnargs{
  723. fn: glfnGetProgramInfoLog,
  724. a0: p.c(),
  725. a1: uintptr(infoLen),
  726. },
  727. parg: unsafe.Pointer(&buf[0]),
  728. blocking: true,
  729. })
  730. return goString(buf)
  731. }
  732. func (ctx *context) GetRenderbufferParameteri(target, pname Enum) int {
  733. return int(ctx.enqueue(call{
  734. args: fnargs{
  735. fn: glfnGetRenderbufferParameteriv,
  736. a0: target.c(),
  737. a1: pname.c(),
  738. },
  739. blocking: true,
  740. }))
  741. }
  742. func (ctx *context) GetShaderi(s Shader, pname Enum) int {
  743. return int(ctx.enqueue(call{
  744. args: fnargs{
  745. fn: glfnGetShaderiv,
  746. a0: s.c(),
  747. a1: pname.c(),
  748. },
  749. blocking: true,
  750. }))
  751. }
  752. func (ctx *context) GetShaderInfoLog(s Shader) string {
  753. infoLen := ctx.GetShaderi(s, INFO_LOG_LENGTH)
  754. if infoLen == 0 {
  755. return ""
  756. }
  757. buf := make([]byte, infoLen)
  758. ctx.enqueue(call{
  759. args: fnargs{
  760. fn: glfnGetShaderInfoLog,
  761. a0: s.c(),
  762. a1: uintptr(infoLen),
  763. },
  764. parg: unsafe.Pointer(&buf[0]),
  765. blocking: true,
  766. })
  767. return goString(buf)
  768. }
  769. func (ctx *context) GetShaderPrecisionFormat(shadertype, precisiontype Enum) (rangeLow, rangeHigh, precision int) {
  770. var rangeAndPrec [3]int32
  771. ctx.enqueue(call{
  772. args: fnargs{
  773. fn: glfnGetShaderPrecisionFormat,
  774. a0: shadertype.c(),
  775. a1: precisiontype.c(),
  776. },
  777. parg: unsafe.Pointer(&rangeAndPrec[0]),
  778. blocking: true,
  779. })
  780. return int(rangeAndPrec[0]), int(rangeAndPrec[1]), int(rangeAndPrec[2])
  781. }
  782. func (ctx *context) GetShaderSource(s Shader) string {
  783. sourceLen := ctx.GetShaderi(s, SHADER_SOURCE_LENGTH)
  784. if sourceLen == 0 {
  785. return ""
  786. }
  787. buf := make([]byte, sourceLen)
  788. ctx.enqueue(call{
  789. args: fnargs{
  790. fn: glfnGetShaderSource,
  791. a0: s.c(),
  792. a1: uintptr(sourceLen),
  793. },
  794. parg: unsafe.Pointer(&buf[0]),
  795. blocking: true,
  796. })
  797. return goString(buf)
  798. }
  799. func (ctx *context) GetString(pname Enum) string {
  800. ret := ctx.enqueue(call{
  801. args: fnargs{
  802. fn: glfnGetString,
  803. a0: pname.c(),
  804. },
  805. blocking: true,
  806. })
  807. retp := unsafe.Pointer(ret)
  808. buf := (*[1 << 24]byte)(retp)[:]
  809. return goString(buf)
  810. }
  811. func (ctx *context) GetTexParameterfv(dst []float32, target, pname Enum) {
  812. ctx.enqueue(call{
  813. args: fnargs{
  814. fn: glfnGetTexParameterfv,
  815. a0: target.c(),
  816. a1: pname.c(),
  817. },
  818. parg: unsafe.Pointer(&dst[0]),
  819. blocking: true,
  820. })
  821. }
  822. func (ctx *context) GetTexParameteriv(dst []int32, target, pname Enum) {
  823. ctx.enqueue(call{
  824. args: fnargs{
  825. fn: glfnGetTexParameteriv,
  826. a0: target.c(),
  827. a1: pname.c(),
  828. },
  829. blocking: true,
  830. })
  831. }
  832. func (ctx *context) GetUniformfv(dst []float32, src Uniform, p Program) {
  833. ctx.enqueue(call{
  834. args: fnargs{
  835. fn: glfnGetUniformfv,
  836. a0: p.c(),
  837. a1: src.c(),
  838. },
  839. parg: unsafe.Pointer(&dst[0]),
  840. blocking: true,
  841. })
  842. }
  843. func (ctx *context) GetUniformiv(dst []int32, src Uniform, p Program) {
  844. ctx.enqueue(call{
  845. args: fnargs{
  846. fn: glfnGetUniformiv,
  847. a0: p.c(),
  848. a1: src.c(),
  849. },
  850. parg: unsafe.Pointer(&dst[0]),
  851. blocking: true,
  852. })
  853. }
  854. func (ctx *context) GetUniformLocation(p Program, name string) Uniform {
  855. s, free := ctx.cString(name)
  856. defer free()
  857. return Uniform{Value: int32(ctx.enqueue(call{
  858. args: fnargs{
  859. fn: glfnGetUniformLocation,
  860. a0: p.c(),
  861. a1: s,
  862. },
  863. blocking: true,
  864. }))}
  865. }
  866. func (ctx *context) GetVertexAttribf(src Attrib, pname Enum) float32 {
  867. var params [1]float32
  868. ctx.GetVertexAttribfv(params[:], src, pname)
  869. return params[0]
  870. }
  871. func (ctx *context) GetVertexAttribfv(dst []float32, src Attrib, pname Enum) {
  872. ctx.enqueue(call{
  873. args: fnargs{
  874. fn: glfnGetVertexAttribfv,
  875. a0: src.c(),
  876. a1: pname.c(),
  877. },
  878. parg: unsafe.Pointer(&dst[0]),
  879. blocking: true,
  880. })
  881. }
  882. func (ctx *context) GetVertexAttribi(src Attrib, pname Enum) int32 {
  883. var params [1]int32
  884. ctx.GetVertexAttribiv(params[:], src, pname)
  885. return params[0]
  886. }
  887. func (ctx *context) GetVertexAttribiv(dst []int32, src Attrib, pname Enum) {
  888. ctx.enqueue(call{
  889. args: fnargs{
  890. fn: glfnGetVertexAttribiv,
  891. a0: src.c(),
  892. a1: pname.c(),
  893. },
  894. parg: unsafe.Pointer(&dst[0]),
  895. blocking: true,
  896. })
  897. }
  898. func (ctx *context) Hint(target, mode Enum) {
  899. ctx.enqueue(call{
  900. args: fnargs{
  901. fn: glfnHint,
  902. a0: target.c(),
  903. a1: mode.c(),
  904. },
  905. })
  906. }
  907. func (ctx *context) IsBuffer(b Buffer) bool {
  908. return 0 != ctx.enqueue(call{
  909. args: fnargs{
  910. fn: glfnIsBuffer,
  911. a0: b.c(),
  912. },
  913. blocking: true,
  914. })
  915. }
  916. func (ctx *context) IsEnabled(cap Enum) bool {
  917. return 0 != ctx.enqueue(call{
  918. args: fnargs{
  919. fn: glfnIsEnabled,
  920. a0: cap.c(),
  921. },
  922. blocking: true,
  923. })
  924. }
  925. func (ctx *context) IsFramebuffer(fb Framebuffer) bool {
  926. return 0 != ctx.enqueue(call{
  927. args: fnargs{
  928. fn: glfnIsFramebuffer,
  929. a0: fb.c(),
  930. },
  931. blocking: true,
  932. })
  933. }
  934. func (ctx *context) IsProgram(p Program) bool {
  935. return 0 != ctx.enqueue(call{
  936. args: fnargs{
  937. fn: glfnIsProgram,
  938. a0: p.c(),
  939. },
  940. blocking: true,
  941. })
  942. }
  943. func (ctx *context) IsRenderbuffer(rb Renderbuffer) bool {
  944. return 0 != ctx.enqueue(call{
  945. args: fnargs{
  946. fn: glfnIsRenderbuffer,
  947. a0: rb.c(),
  948. },
  949. blocking: true,
  950. })
  951. }
  952. func (ctx *context) IsShader(s Shader) bool {
  953. return 0 != ctx.enqueue(call{
  954. args: fnargs{
  955. fn: glfnIsShader,
  956. a0: s.c(),
  957. },
  958. blocking: true,
  959. })
  960. }
  961. func (ctx *context) IsTexture(t Texture) bool {
  962. return 0 != ctx.enqueue(call{
  963. args: fnargs{
  964. fn: glfnIsTexture,
  965. a0: t.c(),
  966. },
  967. blocking: true,
  968. })
  969. }
  970. func (ctx *context) LineWidth(width float32) {
  971. ctx.enqueue(call{
  972. args: fnargs{
  973. fn: glfnLineWidth,
  974. a0: uintptr(math.Float32bits(width)),
  975. },
  976. })
  977. }
  978. func (ctx *context) LinkProgram(p Program) {
  979. ctx.enqueue(call{
  980. args: fnargs{
  981. fn: glfnLinkProgram,
  982. a0: p.c(),
  983. },
  984. })
  985. }
  986. func (ctx *context) PixelStorei(pname Enum, param int32) {
  987. ctx.enqueue(call{
  988. args: fnargs{
  989. fn: glfnPixelStorei,
  990. a0: pname.c(),
  991. a1: uintptr(param),
  992. },
  993. })
  994. }
  995. func (ctx *context) PolygonOffset(factor, units float32) {
  996. ctx.enqueue(call{
  997. args: fnargs{
  998. fn: glfnPolygonOffset,
  999. a0: uintptr(math.Float32bits(factor)),
  1000. a1: uintptr(math.Float32bits(units)),
  1001. },
  1002. })
  1003. }
  1004. func (ctx *context) ReadPixels(dst []byte, x, y, width, height int, format, ty Enum) {
  1005. ctx.enqueue(call{
  1006. args: fnargs{
  1007. fn: glfnReadPixels,
  1008. // TODO(crawshaw): support PIXEL_PACK_BUFFER in GLES3, uses offset.
  1009. a0: uintptr(x),
  1010. a1: uintptr(y),
  1011. a2: uintptr(width),
  1012. a3: uintptr(height),
  1013. a4: format.c(),
  1014. a5: ty.c(),
  1015. },
  1016. parg: unsafe.Pointer(&dst[0]),
  1017. blocking: true,
  1018. })
  1019. }
  1020. func (ctx *context) ReleaseShaderCompiler() {
  1021. ctx.enqueue(call{
  1022. args: fnargs{
  1023. fn: glfnReleaseShaderCompiler,
  1024. },
  1025. })
  1026. }
  1027. func (ctx *context) RenderbufferStorage(target, internalFormat Enum, width, height int) {
  1028. ctx.enqueue(call{
  1029. args: fnargs{
  1030. fn: glfnRenderbufferStorage,
  1031. a0: target.c(),
  1032. a1: internalFormat.c(),
  1033. a2: uintptr(width),
  1034. a3: uintptr(height),
  1035. },
  1036. })
  1037. }
  1038. func (ctx *context) SampleCoverage(value float32, invert bool) {
  1039. ctx.enqueue(call{
  1040. args: fnargs{
  1041. fn: glfnSampleCoverage,
  1042. a0: uintptr(math.Float32bits(value)),
  1043. a1: glBoolean(invert),
  1044. },
  1045. })
  1046. }
  1047. func (ctx *context) Scissor(x, y, width, height int32) {
  1048. ctx.enqueue(call{
  1049. args: fnargs{
  1050. fn: glfnScissor,
  1051. a0: uintptr(x),
  1052. a1: uintptr(y),
  1053. a2: uintptr(width),
  1054. a3: uintptr(height),
  1055. },
  1056. })
  1057. }
  1058. func (ctx *context) ShaderSource(s Shader, src string) {
  1059. strp, free := ctx.cStringPtr(src)
  1060. defer free()
  1061. ctx.enqueue(call{
  1062. args: fnargs{
  1063. fn: glfnShaderSource,
  1064. a0: s.c(),
  1065. a1: 1,
  1066. a2: strp,
  1067. },
  1068. blocking: true,
  1069. })
  1070. }
  1071. func (ctx *context) StencilFunc(fn Enum, ref int, mask uint32) {
  1072. ctx.enqueue(call{
  1073. args: fnargs{
  1074. fn: glfnStencilFunc,
  1075. a0: fn.c(),
  1076. a1: uintptr(ref),
  1077. a2: uintptr(mask),
  1078. },
  1079. })
  1080. }
  1081. func (ctx *context) StencilFuncSeparate(face, fn Enum, ref int, mask uint32) {
  1082. ctx.enqueue(call{
  1083. args: fnargs{
  1084. fn: glfnStencilFuncSeparate,
  1085. a0: face.c(),
  1086. a1: fn.c(),
  1087. a2: uintptr(ref),
  1088. a3: uintptr(mask),
  1089. },
  1090. })
  1091. }
  1092. func (ctx *context) StencilMask(mask uint32) {
  1093. ctx.enqueue(call{
  1094. args: fnargs{
  1095. fn: glfnStencilMask,
  1096. a0: uintptr(mask),
  1097. },
  1098. })
  1099. }
  1100. func (ctx *context) StencilMaskSeparate(face Enum, mask uint32) {
  1101. ctx.enqueue(call{
  1102. args: fnargs{
  1103. fn: glfnStencilMaskSeparate,
  1104. a0: face.c(),
  1105. a1: uintptr(mask),
  1106. },
  1107. })
  1108. }
  1109. func (ctx *context) StencilOp(fail, zfail, zpass Enum) {
  1110. ctx.enqueue(call{
  1111. args: fnargs{
  1112. fn: glfnStencilOp,
  1113. a0: fail.c(),
  1114. a1: zfail.c(),
  1115. a2: zpass.c(),
  1116. },
  1117. })
  1118. }
  1119. func (ctx *context) StencilOpSeparate(face, sfail, dpfail, dppass Enum) {
  1120. ctx.enqueue(call{
  1121. args: fnargs{
  1122. fn: glfnStencilOpSeparate,
  1123. a0: face.c(),
  1124. a1: sfail.c(),
  1125. a2: dpfail.c(),
  1126. a3: dppass.c(),
  1127. },
  1128. })
  1129. }
  1130. func (ctx *context) TexImage2D(target Enum, level int, internalFormat int, width, height int, format Enum, ty Enum, data []byte) {
  1131. // It is common to pass TexImage2D a nil data, indicating that a
  1132. // bound GL buffer is being used as the source. In that case, it
  1133. // is not necessary to block.
  1134. parg := unsafe.Pointer(nil)
  1135. if len(data) > 0 {
  1136. parg = unsafe.Pointer(&data[0])
  1137. }
  1138. ctx.enqueue(call{
  1139. args: fnargs{
  1140. fn: glfnTexImage2D,
  1141. // TODO(crawshaw): GLES3 offset for PIXEL_UNPACK_BUFFER and PIXEL_PACK_BUFFER.
  1142. a0: target.c(),
  1143. a1: uintptr(level),
  1144. a2: uintptr(internalFormat),
  1145. a3: uintptr(width),
  1146. a4: uintptr(height),
  1147. a5: format.c(),
  1148. a6: ty.c(),
  1149. },
  1150. parg: parg,
  1151. blocking: parg != nil,
  1152. })
  1153. }
  1154. func (ctx *context) TexSubImage2D(target Enum, level int, x, y, width, height int, format, ty Enum, data []byte) {
  1155. // It is common to pass TexSubImage2D a nil data, indicating that a
  1156. // bound GL buffer is being used as the source. In that case, it
  1157. // is not necessary to block.
  1158. parg := unsafe.Pointer(nil)
  1159. if len(data) > 0 {
  1160. parg = unsafe.Pointer(&data[0])
  1161. }
  1162. ctx.enqueue(call{
  1163. args: fnargs{
  1164. fn: glfnTexSubImage2D,
  1165. // TODO(crawshaw): GLES3 offset for PIXEL_UNPACK_BUFFER and PIXEL_PACK_BUFFER.
  1166. a0: target.c(),
  1167. a1: uintptr(level),
  1168. a2: uintptr(x),
  1169. a3: uintptr(y),
  1170. a4: uintptr(width),
  1171. a5: uintptr(height),
  1172. a6: format.c(),
  1173. a7: ty.c(),
  1174. },
  1175. parg: parg,
  1176. blocking: parg != nil,
  1177. })
  1178. }
  1179. func (ctx *context) TexParameterf(target, pname Enum, param float32) {
  1180. ctx.enqueue(call{
  1181. args: fnargs{
  1182. fn: glfnTexParameterf,
  1183. a0: target.c(),
  1184. a1: pname.c(),
  1185. a2: uintptr(math.Float32bits(param)),
  1186. },
  1187. })
  1188. }
  1189. func (ctx *context) TexParameterfv(target, pname Enum, params []float32) {
  1190. ctx.enqueue(call{
  1191. args: fnargs{
  1192. fn: glfnTexParameterfv,
  1193. a0: target.c(),
  1194. a1: pname.c(),
  1195. },
  1196. parg: unsafe.Pointer(&params[0]),
  1197. blocking: true,
  1198. })
  1199. }
  1200. func (ctx *context) TexParameteri(target, pname Enum, param int) {
  1201. ctx.enqueue(call{
  1202. args: fnargs{
  1203. fn: glfnTexParameteri,
  1204. a0: target.c(),
  1205. a1: pname.c(),
  1206. a2: uintptr(param),
  1207. },
  1208. })
  1209. }
  1210. func (ctx *context) TexParameteriv(target, pname Enum, params []int32) {
  1211. ctx.enqueue(call{
  1212. args: fnargs{
  1213. fn: glfnTexParameteriv,
  1214. a0: target.c(),
  1215. a1: pname.c(),
  1216. },
  1217. parg: unsafe.Pointer(&params[0]),
  1218. blocking: true,
  1219. })
  1220. }
  1221. func (ctx *context) Uniform1f(dst Uniform, v float32) {
  1222. ctx.enqueue(call{
  1223. args: fnargs{
  1224. fn: glfnUniform1f,
  1225. a0: dst.c(),
  1226. a1: uintptr(math.Float32bits(v)),
  1227. },
  1228. })
  1229. }
  1230. func (ctx *context) Uniform1fv(dst Uniform, src []float32) {
  1231. ctx.enqueue(call{
  1232. args: fnargs{
  1233. fn: glfnUniform1fv,
  1234. a0: dst.c(),
  1235. a1: uintptr(len(src)),
  1236. },
  1237. parg: unsafe.Pointer(&src[0]),
  1238. blocking: true,
  1239. })
  1240. }
  1241. func (ctx *context) Uniform1i(dst Uniform, v int) {
  1242. ctx.enqueue(call{
  1243. args: fnargs{
  1244. fn: glfnUniform1i,
  1245. a0: dst.c(),
  1246. a1: uintptr(v),
  1247. },
  1248. })
  1249. }
  1250. func (ctx *context) Uniform1iv(dst Uniform, src []int32) {
  1251. ctx.enqueue(call{
  1252. args: fnargs{
  1253. fn: glfnUniform1iv,
  1254. a0: dst.c(),
  1255. a1: uintptr(len(src)),
  1256. },
  1257. parg: unsafe.Pointer(&src[0]),
  1258. blocking: true,
  1259. })
  1260. }
  1261. func (ctx *context) Uniform2f(dst Uniform, v0, v1 float32) {
  1262. ctx.enqueue(call{
  1263. args: fnargs{
  1264. fn: glfnUniform2f,
  1265. a0: dst.c(),
  1266. a1: uintptr(math.Float32bits(v0)),
  1267. a2: uintptr(math.Float32bits(v1)),
  1268. },
  1269. })
  1270. }
  1271. func (ctx *context) Uniform2fv(dst Uniform, src []float32) {
  1272. ctx.enqueue(call{
  1273. args: fnargs{
  1274. fn: glfnUniform2fv,
  1275. a0: dst.c(),
  1276. a1: uintptr(len(src) / 2),
  1277. },
  1278. parg: unsafe.Pointer(&src[0]),
  1279. blocking: true,
  1280. })
  1281. }
  1282. func (ctx *context) Uniform2i(dst Uniform, v0, v1 int) {
  1283. ctx.enqueue(call{
  1284. args: fnargs{
  1285. fn: glfnUniform2i,
  1286. a0: dst.c(),
  1287. a1: uintptr(v0),
  1288. a2: uintptr(v1),
  1289. },
  1290. })
  1291. }
  1292. func (ctx *context) Uniform2iv(dst Uniform, src []int32) {
  1293. ctx.enqueue(call{
  1294. args: fnargs{
  1295. fn: glfnUniform2iv,
  1296. a0: dst.c(),
  1297. a1: uintptr(len(src) / 2),
  1298. },
  1299. parg: unsafe.Pointer(&src[0]),
  1300. blocking: true,
  1301. })
  1302. }
  1303. func (ctx *context) Uniform3f(dst Uniform, v0, v1, v2 float32) {
  1304. ctx.enqueue(call{
  1305. args: fnargs{
  1306. fn: glfnUniform3f,
  1307. a0: dst.c(),
  1308. a1: uintptr(math.Float32bits(v0)),
  1309. a2: uintptr(math.Float32bits(v1)),
  1310. a3: uintptr(math.Float32bits(v2)),
  1311. },
  1312. })
  1313. }
  1314. func (ctx *context) Uniform3fv(dst Uniform, src []float32) {
  1315. ctx.enqueue(call{
  1316. args: fnargs{
  1317. fn: glfnUniform3fv,
  1318. a0: dst.c(),
  1319. a1: uintptr(len(src) / 3),
  1320. },
  1321. parg: unsafe.Pointer(&src[0]),
  1322. blocking: true,
  1323. })
  1324. }
  1325. func (ctx *context) Uniform3i(dst Uniform, v0, v1, v2 int32) {
  1326. ctx.enqueue(call{
  1327. args: fnargs{
  1328. fn: glfnUniform3i,
  1329. a0: dst.c(),
  1330. a1: uintptr(v0),
  1331. a2: uintptr(v1),
  1332. a3: uintptr(v2),
  1333. },
  1334. })
  1335. }
  1336. func (ctx *context) Uniform3iv(dst Uniform, src []int32) {
  1337. ctx.enqueue(call{
  1338. args: fnargs{
  1339. fn: glfnUniform3iv,
  1340. a0: dst.c(),
  1341. a1: uintptr(len(src) / 3),
  1342. },
  1343. parg: unsafe.Pointer(&src[0]),
  1344. blocking: true,
  1345. })
  1346. }
  1347. func (ctx *context) Uniform4f(dst Uniform, v0, v1, v2, v3 float32) {
  1348. ctx.enqueue(call{
  1349. args: fnargs{
  1350. fn: glfnUniform4f,
  1351. a0: dst.c(),
  1352. a1: uintptr(math.Float32bits(v0)),
  1353. a2: uintptr(math.Float32bits(v1)),
  1354. a3: uintptr(math.Float32bits(v2)),
  1355. a4: uintptr(math.Float32bits(v3)),
  1356. },
  1357. })
  1358. }
  1359. func (ctx *context) Uniform4fv(dst Uniform, src []float32) {
  1360. ctx.enqueue(call{
  1361. args: fnargs{
  1362. fn: glfnUniform4fv,
  1363. a0: dst.c(),
  1364. a1: uintptr(len(src) / 4),
  1365. },
  1366. parg: unsafe.Pointer(&src[0]),
  1367. blocking: true,
  1368. })
  1369. }
  1370. func (ctx *context) Uniform4i(dst Uniform, v0, v1, v2, v3 int32) {
  1371. ctx.enqueue(call{
  1372. args: fnargs{
  1373. fn: glfnUniform4i,
  1374. a0: dst.c(),
  1375. a1: uintptr(v0),
  1376. a2: uintptr(v1),
  1377. a3: uintptr(v2),
  1378. a4: uintptr(v3),
  1379. },
  1380. })
  1381. }
  1382. func (ctx *context) Uniform4iv(dst Uniform, src []int32) {
  1383. ctx.enqueue(call{
  1384. args: fnargs{
  1385. fn: glfnUniform4iv,
  1386. a0: dst.c(),
  1387. a1: uintptr(len(src) / 4),
  1388. },
  1389. parg: unsafe.Pointer(&src[0]),
  1390. blocking: true,
  1391. })
  1392. }
  1393. func (ctx *context) UniformMatrix2fv(dst Uniform, src []float32) {
  1394. ctx.enqueue(call{
  1395. args: fnargs{
  1396. fn: glfnUniformMatrix2fv,
  1397. // OpenGL ES 2 does not support transpose.
  1398. a0: dst.c(),
  1399. a1: uintptr(len(src) / 4),
  1400. },
  1401. parg: unsafe.Pointer(&src[0]),
  1402. blocking: true,
  1403. })
  1404. }
  1405. func (ctx *context) UniformMatrix3fv(dst Uniform, src []float32) {
  1406. ctx.enqueue(call{
  1407. args: fnargs{
  1408. fn: glfnUniformMatrix3fv,
  1409. a0: dst.c(),
  1410. a1: uintptr(len(src) / 9),
  1411. },
  1412. parg: unsafe.Pointer(&src[0]),
  1413. blocking: true,
  1414. })
  1415. }
  1416. func (ctx *context) UniformMatrix4fv(dst Uniform, src []float32) {
  1417. ctx.enqueue(call{
  1418. args: fnargs{
  1419. fn: glfnUniformMatrix4fv,
  1420. a0: dst.c(),
  1421. a1: uintptr(len(src) / 16),
  1422. },
  1423. parg: unsafe.Pointer(&src[0]),
  1424. blocking: true,
  1425. })
  1426. }
  1427. func (ctx *context) UseProgram(p Program) {
  1428. ctx.enqueue(call{
  1429. args: fnargs{
  1430. fn: glfnUseProgram,
  1431. a0: p.c(),
  1432. },
  1433. })
  1434. }
  1435. func (ctx *context) ValidateProgram(p Program) {
  1436. ctx.enqueue(call{
  1437. args: fnargs{
  1438. fn: glfnValidateProgram,
  1439. a0: p.c(),
  1440. },
  1441. })
  1442. }
  1443. func (ctx *context) VertexAttrib1f(dst Attrib, x float32) {
  1444. ctx.enqueue(call{
  1445. args: fnargs{
  1446. fn: glfnVertexAttrib1f,
  1447. a0: dst.c(),
  1448. a1: uintptr(math.Float32bits(x)),
  1449. },
  1450. })
  1451. }
  1452. func (ctx *context) VertexAttrib1fv(dst Attrib, src []float32) {
  1453. ctx.enqueue(call{
  1454. args: fnargs{
  1455. fn: glfnVertexAttrib1fv,
  1456. a0: dst.c(),
  1457. },
  1458. parg: unsafe.Pointer(&src[0]),
  1459. blocking: true,
  1460. })
  1461. }
  1462. func (ctx *context) VertexAttrib2f(dst Attrib, x, y float32) {
  1463. ctx.enqueue(call{
  1464. args: fnargs{
  1465. fn: glfnVertexAttrib2f,
  1466. a0: dst.c(),
  1467. a1: uintptr(math.Float32bits(x)),
  1468. a2: uintptr(math.Float32bits(y)),
  1469. },
  1470. })
  1471. }
  1472. func (ctx *context) VertexAttrib2fv(dst Attrib, src []float32) {
  1473. ctx.enqueue(call{
  1474. args: fnargs{
  1475. fn: glfnVertexAttrib2fv,
  1476. a0: dst.c(),
  1477. },
  1478. parg: unsafe.Pointer(&src[0]),
  1479. blocking: true,
  1480. })
  1481. }
  1482. func (ctx *context) VertexAttrib3f(dst Attrib, x, y, z float32) {
  1483. ctx.enqueue(call{
  1484. args: fnargs{
  1485. fn: glfnVertexAttrib3f,
  1486. a0: dst.c(),
  1487. a1: uintptr(math.Float32bits(x)),
  1488. a2: uintptr(math.Float32bits(y)),
  1489. a3: uintptr(math.Float32bits(z)),
  1490. },
  1491. })
  1492. }
  1493. func (ctx *context) VertexAttrib3fv(dst Attrib, src []float32) {
  1494. ctx.enqueue(call{
  1495. args: fnargs{
  1496. fn: glfnVertexAttrib3fv,
  1497. a0: dst.c(),
  1498. },
  1499. parg: unsafe.Pointer(&src[0]),
  1500. blocking: true,
  1501. })
  1502. }
  1503. func (ctx *context) VertexAttrib4f(dst Attrib, x, y, z, w float32) {
  1504. ctx.enqueue(call{
  1505. args: fnargs{
  1506. fn: glfnVertexAttrib4f,
  1507. a0: dst.c(),
  1508. a1: uintptr(math.Float32bits(x)),
  1509. a2: uintptr(math.Float32bits(y)),
  1510. a3: uintptr(math.Float32bits(z)),
  1511. a4: uintptr(math.Float32bits(w)),
  1512. },
  1513. })
  1514. }
  1515. func (ctx *context) VertexAttrib4fv(dst Attrib, src []float32) {
  1516. ctx.enqueue(call{
  1517. args: fnargs{
  1518. fn: glfnVertexAttrib4fv,
  1519. a0: dst.c(),
  1520. },
  1521. parg: unsafe.Pointer(&src[0]),
  1522. blocking: true,
  1523. })
  1524. }
  1525. func (ctx *context) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride, offset int) {
  1526. ctx.enqueue(call{
  1527. args: fnargs{
  1528. fn: glfnVertexAttribPointer,
  1529. a0: dst.c(),
  1530. a1: uintptr(size),
  1531. a2: ty.c(),
  1532. a3: glBoolean(normalized),
  1533. a4: uintptr(stride),
  1534. a5: uintptr(offset),
  1535. },
  1536. })
  1537. }
  1538. func (ctx *context) Viewport(x, y, width, height int) {
  1539. ctx.enqueue(call{
  1540. args: fnargs{
  1541. fn: glfnViewport,
  1542. a0: uintptr(x),
  1543. a1: uintptr(y),
  1544. a2: uintptr(width),
  1545. a3: uintptr(height),
  1546. },
  1547. })
  1548. }
  1549. func (ctx context3) UniformMatrix2x3fv(dst Uniform, src []float32) {
  1550. ctx.enqueue(call{
  1551. args: fnargs{
  1552. fn: glfnUniformMatrix2x3fv,
  1553. a0: dst.c(),
  1554. a1: uintptr(len(src) / 6),
  1555. },
  1556. parg: unsafe.Pointer(&src[0]),
  1557. blocking: true,
  1558. })
  1559. }
  1560. func (ctx context3) UniformMatrix3x2fv(dst Uniform, src []float32) {
  1561. ctx.enqueue(call{
  1562. args: fnargs{
  1563. fn: glfnUniformMatrix3x2fv,
  1564. a0: dst.c(),
  1565. a1: uintptr(len(src) / 6),
  1566. },
  1567. parg: unsafe.Pointer(&src[0]),
  1568. blocking: true,
  1569. })
  1570. }
  1571. func (ctx context3) UniformMatrix2x4fv(dst Uniform, src []float32) {
  1572. ctx.enqueue(call{
  1573. args: fnargs{
  1574. fn: glfnUniformMatrix2x4fv,
  1575. a0: dst.c(),
  1576. a1: uintptr(len(src) / 8),
  1577. },
  1578. parg: unsafe.Pointer(&src[0]),
  1579. blocking: true,
  1580. })
  1581. }
  1582. func (ctx context3) UniformMatrix4x2fv(dst Uniform, src []float32) {
  1583. ctx.enqueue(call{
  1584. args: fnargs{
  1585. fn: glfnUniformMatrix4x2fv,
  1586. a0: dst.c(),
  1587. a1: uintptr(len(src) / 8),
  1588. },
  1589. parg: unsafe.Pointer(&src[0]),
  1590. blocking: true,
  1591. })
  1592. }
  1593. func (ctx context3) UniformMatrix3x4fv(dst Uniform, src []float32) {
  1594. ctx.enqueue(call{
  1595. args: fnargs{
  1596. fn: glfnUniformMatrix3x4fv,
  1597. a0: dst.c(),
  1598. a1: uintptr(len(src) / 12),
  1599. },
  1600. parg: unsafe.Pointer(&src[0]),
  1601. blocking: true,
  1602. })
  1603. }
  1604. func (ctx context3) UniformMatrix4x3fv(dst Uniform, src []float32) {
  1605. ctx.enqueue(call{
  1606. args: fnargs{
  1607. fn: glfnUniformMatrix4x3fv,
  1608. a0: dst.c(),
  1609. a1: uintptr(len(src) / 12),
  1610. },
  1611. parg: unsafe.Pointer(&src[0]),
  1612. blocking: true,
  1613. })
  1614. }
  1615. func (ctx context3) BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1 int, mask uint, filter Enum) {
  1616. ctx.enqueue(call{
  1617. args: fnargs{
  1618. fn: glfnBlitFramebuffer,
  1619. a0: uintptr(srcX0),
  1620. a1: uintptr(srcY0),
  1621. a2: uintptr(srcX1),
  1622. a3: uintptr(srcY1),
  1623. a4: uintptr(dstX0),
  1624. a5: uintptr(dstY0),
  1625. a6: uintptr(dstX1),
  1626. a7: uintptr(dstY1),
  1627. a8: uintptr(mask),
  1628. a9: filter.c(),
  1629. },
  1630. })
  1631. }
  1632. func (ctx context3) Uniform1ui(dst Uniform, v uint32) {
  1633. ctx.enqueue(call{
  1634. args: fnargs{
  1635. fn: glfnUniform1ui,
  1636. a0: dst.c(),
  1637. a1: uintptr(v),
  1638. },
  1639. })
  1640. }
  1641. func (ctx context3) Uniform2ui(dst Uniform, v0, v1 uint32) {
  1642. ctx.enqueue(call{
  1643. args: fnargs{
  1644. fn: glfnUniform2ui,
  1645. a0: dst.c(),
  1646. a1: uintptr(v0),
  1647. a2: uintptr(v1),
  1648. },
  1649. })
  1650. }
  1651. func (ctx context3) Uniform3ui(dst Uniform, v0, v1, v2 uint) {
  1652. ctx.enqueue(call{
  1653. args: fnargs{
  1654. fn: glfnUniform3ui,
  1655. a0: dst.c(),
  1656. a1: uintptr(v0),
  1657. a2: uintptr(v1),
  1658. a3: uintptr(v2),
  1659. },
  1660. })
  1661. }
  1662. func (ctx context3) Uniform4ui(dst Uniform, v0, v1, v2, v3 uint32) {
  1663. ctx.enqueue(call{
  1664. args: fnargs{
  1665. fn: glfnUniform4ui,
  1666. a0: dst.c(),
  1667. a1: uintptr(v0),
  1668. a2: uintptr(v1),
  1669. a3: uintptr(v2),
  1670. a4: uintptr(v3),
  1671. },
  1672. })
  1673. }