gl.go 35 KB

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