gl_unix.go 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323
  1. // SPDX-License-Identifier: Unlicense OR MIT
  2. //go:build darwin || linux || freebsd || openbsd
  3. // +build darwin linux freebsd openbsd
  4. package gl
  5. import (
  6. "fmt"
  7. "runtime"
  8. "strings"
  9. "unsafe"
  10. )
  11. /*
  12. #cgo CFLAGS: -Werror
  13. #cgo linux freebsd LDFLAGS: -ldl
  14. #include <stdint.h>
  15. #include <stdlib.h>
  16. #include <sys/types.h>
  17. #define __USE_GNU
  18. #include <dlfcn.h>
  19. typedef unsigned int GLenum;
  20. typedef unsigned int GLuint;
  21. typedef char GLchar;
  22. typedef float GLfloat;
  23. typedef ssize_t GLsizeiptr;
  24. typedef intptr_t GLintptr;
  25. typedef unsigned int GLbitfield;
  26. typedef int GLint;
  27. typedef unsigned char GLboolean;
  28. typedef int GLsizei;
  29. typedef uint8_t GLubyte;
  30. typedef void (*_glActiveTexture)(GLenum texture);
  31. typedef void (*_glAttachShader)(GLuint program, GLuint shader);
  32. typedef void (*_glBindAttribLocation)(GLuint program, GLuint index, const GLchar *name);
  33. typedef void (*_glBindBuffer)(GLenum target, GLuint buffer);
  34. typedef void (*_glBindFramebuffer)(GLenum target, GLuint framebuffer);
  35. typedef void (*_glBindRenderbuffer)(GLenum target, GLuint renderbuffer);
  36. typedef void (*_glBindTexture)(GLenum target, GLuint texture);
  37. typedef void (*_glBlendEquation)(GLenum mode);
  38. typedef void (*_glBlendFuncSeparate)(GLenum srcRGB, GLenum dstRGB, GLenum srcA, GLenum dstA);
  39. typedef void (*_glBufferData)(GLenum target, GLsizeiptr size, const void *data, GLenum usage);
  40. typedef void (*_glBufferSubData)(GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
  41. typedef GLenum (*_glCheckFramebufferStatus)(GLenum target);
  42. typedef void (*_glClear)(GLbitfield mask);
  43. typedef void (*_glClearColor)(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  44. typedef void (*_glClearDepthf)(GLfloat d);
  45. typedef void (*_glCompileShader)(GLuint shader);
  46. typedef void (*_glCopyTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
  47. typedef GLuint (*_glCreateProgram)(void);
  48. typedef GLuint (*_glCreateShader)(GLenum type);
  49. typedef void (*_glDeleteBuffers)(GLsizei n, const GLuint *buffers);
  50. typedef void (*_glDeleteFramebuffers)(GLsizei n, const GLuint *framebuffers);
  51. typedef void (*_glDeleteProgram)(GLuint program);
  52. typedef void (*_glDeleteRenderbuffers)(GLsizei n, const GLuint *renderbuffers);
  53. typedef void (*_glDeleteShader)(GLuint shader);
  54. typedef void (*_glDeleteTextures)(GLsizei n, const GLuint *textures);
  55. typedef void (*_glDepthFunc)(GLenum func);
  56. typedef void (*_glDepthMask)(GLboolean flag);
  57. typedef void (*_glDisable)(GLenum cap);
  58. typedef void (*_glDisableVertexAttribArray)(GLuint index);
  59. typedef void (*_glDrawArrays)(GLenum mode, GLint first, GLsizei count);
  60. typedef void (*_glDrawElements)(GLenum mode, GLsizei count, GLenum type, const void *indices);
  61. typedef void (*_glEnable)(GLenum cap);
  62. typedef void (*_glEnableVertexAttribArray)(GLuint index);
  63. typedef void (*_glFinish)(void);
  64. typedef void (*_glFlush)(void);
  65. typedef void (*_glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
  66. typedef void (*_glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
  67. typedef void (*_glGenBuffers)(GLsizei n, GLuint *buffers);
  68. typedef void (*_glGenerateMipmap)(GLenum target);
  69. typedef void (*_glGenFramebuffers)(GLsizei n, GLuint *framebuffers);
  70. typedef void (*_glGenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
  71. typedef void (*_glGenTextures)(GLsizei n, GLuint *textures);
  72. typedef GLenum (*_glGetError)(void);
  73. typedef void (*_glGetFramebufferAttachmentParameteriv)(GLenum target, GLenum attachment, GLenum pname, GLint *params);
  74. typedef void (*_glGetFloatv)(GLenum pname, GLfloat *data);
  75. typedef void (*_glGetIntegerv)(GLenum pname, GLint *data);
  76. typedef void (*_glGetIntegeri_v)(GLenum pname, GLuint idx, GLint *data);
  77. typedef void (*_glGetProgramiv)(GLuint program, GLenum pname, GLint *params);
  78. typedef void (*_glGetProgramInfoLog)(GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  79. typedef void (*_glGetRenderbufferParameteriv)(GLenum target, GLenum pname, GLint *params);
  80. typedef void (*_glGetShaderiv)(GLuint shader, GLenum pname, GLint *params);
  81. typedef void (*_glGetShaderInfoLog)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
  82. typedef const GLubyte *(*_glGetString)(GLenum name);
  83. typedef GLint (*_glGetUniformLocation)(GLuint program, const GLchar *name);
  84. typedef void (*_glGetVertexAttribiv)(GLuint index, GLenum pname, GLint *params);
  85. typedef void (*_glGetVertexAttribPointerv)(GLuint index, GLenum pname, void **params);
  86. typedef GLboolean (*_glIsEnabled)(GLenum cap);
  87. typedef void (*_glLinkProgram)(GLuint program);
  88. typedef void (*_glPixelStorei)(GLenum pname, GLint param);
  89. typedef void (*_glReadPixels)(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
  90. typedef void (*_glRenderbufferStorage)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
  91. typedef void (*_glScissor)(GLint x, GLint y, GLsizei width, GLsizei height);
  92. typedef void (*_glShaderSource)(GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
  93. typedef void (*_glTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
  94. typedef void (*_glTexParameteri)(GLenum target, GLenum pname, GLint param);
  95. typedef void (*_glTexSubImage2D)(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
  96. typedef void (*_glUniform1f)(GLint location, GLfloat v0);
  97. typedef void (*_glUniform1i)(GLint location, GLint v0);
  98. typedef void (*_glUniform2f)(GLint location, GLfloat v0, GLfloat v1);
  99. typedef void (*_glUniform3f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
  100. typedef void (*_glUniform4f)(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
  101. typedef void (*_glUseProgram)(GLuint program);
  102. typedef void (*_glVertexAttribPointer)(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
  103. typedef void (*_glViewport)(GLint x, GLint y, GLsizei width, GLsizei height);
  104. typedef void (*_glBindVertexArray)(GLuint array);
  105. typedef void (*_glBindBufferBase)(GLenum target, GLuint index, GLuint buffer);
  106. typedef GLuint (*_glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName);
  107. typedef void (*_glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding);
  108. typedef void (*_glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments);
  109. typedef void (*_glBeginQuery)(GLenum target, GLuint id);
  110. typedef void (*_glDeleteQueries)(GLsizei n, const GLuint *ids);
  111. typedef void (*_glDeleteVertexArrays)(GLsizei n, const GLuint *ids);
  112. typedef void (*_glEndQuery)(GLenum target);
  113. typedef void (*_glGenQueries)(GLsizei n, GLuint *ids);
  114. typedef void (*_glGenVertexArrays)(GLsizei n, GLuint *ids);
  115. typedef void (*_glGetProgramBinary)(GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary);
  116. typedef void (*_glGetQueryObjectuiv)(GLuint id, GLenum pname, GLuint *params);
  117. typedef const GLubyte* (*_glGetStringi)(GLenum name, GLuint index);
  118. typedef void (*_glDispatchCompute)(GLuint x, GLuint y, GLuint z);
  119. typedef void (*_glMemoryBarrier)(GLbitfield barriers);
  120. typedef void* (*_glMapBufferRange)(GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
  121. typedef GLboolean (*_glUnmapBuffer)(GLenum target);
  122. typedef void (*_glBindImageTexture)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format);
  123. typedef void (*_glTexStorage2D)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
  124. typedef void (*_glBlitFramebuffer)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter);
  125. static void glActiveTexture(_glActiveTexture f, GLenum texture) {
  126. f(texture);
  127. }
  128. static void glAttachShader(_glAttachShader f, GLuint program, GLuint shader) {
  129. f(program, shader);
  130. }
  131. static void glBindAttribLocation(_glBindAttribLocation f, GLuint program, GLuint index, const GLchar *name) {
  132. f(program, index, name);
  133. }
  134. static void glBindBuffer(_glBindBuffer f, GLenum target, GLuint buffer) {
  135. f(target, buffer);
  136. }
  137. static void glBindFramebuffer(_glBindFramebuffer f, GLenum target, GLuint framebuffer) {
  138. f(target, framebuffer);
  139. }
  140. static void glBindRenderbuffer(_glBindRenderbuffer f, GLenum target, GLuint renderbuffer) {
  141. f(target, renderbuffer);
  142. }
  143. static void glBindTexture(_glBindTexture f, GLenum target, GLuint texture) {
  144. f(target, texture);
  145. }
  146. static void glBindVertexArray(_glBindVertexArray f, GLuint array) {
  147. f(array);
  148. }
  149. static void glBlendEquation(_glBlendEquation f, GLenum mode) {
  150. f(mode);
  151. }
  152. static void glBlendFuncSeparate(_glBlendFuncSeparate f, GLenum srcRGB, GLenum dstRGB, GLenum srcA, GLenum dstA) {
  153. f(srcRGB, dstRGB, srcA, dstA);
  154. }
  155. static void glBufferData(_glBufferData f, GLenum target, GLsizeiptr size, const void *data, GLenum usage) {
  156. f(target, size, data, usage);
  157. }
  158. static void glBufferSubData(_glBufferSubData f, GLenum target, GLintptr offset, GLsizeiptr size, const void *data) {
  159. f(target, offset, size, data);
  160. }
  161. static GLenum glCheckFramebufferStatus(_glCheckFramebufferStatus f, GLenum target) {
  162. return f(target);
  163. }
  164. static void glClear(_glClear f, GLbitfield mask) {
  165. f(mask);
  166. }
  167. static void glClearColor(_glClearColor f, GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
  168. f(red, green, blue, alpha);
  169. }
  170. static void glClearDepthf(_glClearDepthf f, GLfloat d) {
  171. f(d);
  172. }
  173. static void glCompileShader(_glCompileShader f, GLuint shader) {
  174. f(shader);
  175. }
  176. static void glCopyTexSubImage2D(_glCopyTexSubImage2D f, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) {
  177. f(target, level, xoffset, yoffset, x, y, width, height);
  178. }
  179. static GLuint glCreateProgram(_glCreateProgram f) {
  180. return f();
  181. }
  182. static GLuint glCreateShader(_glCreateShader f, GLenum type) {
  183. return f(type);
  184. }
  185. static void glDeleteBuffers(_glDeleteBuffers f, GLsizei n, const GLuint *buffers) {
  186. f(n, buffers);
  187. }
  188. static void glDeleteFramebuffers(_glDeleteFramebuffers f, GLsizei n, const GLuint *framebuffers) {
  189. f(n, framebuffers);
  190. }
  191. static void glDeleteProgram(_glDeleteProgram f, GLuint program) {
  192. f(program);
  193. }
  194. static void glDeleteRenderbuffers(_glDeleteRenderbuffers f, GLsizei n, const GLuint *renderbuffers) {
  195. f(n, renderbuffers);
  196. }
  197. static void glDeleteShader(_glDeleteShader f, GLuint shader) {
  198. f(shader);
  199. }
  200. static void glDeleteTextures(_glDeleteTextures f, GLsizei n, const GLuint *textures) {
  201. f(n, textures);
  202. }
  203. static void glDepthFunc(_glDepthFunc f, GLenum func) {
  204. f(func);
  205. }
  206. static void glDepthMask(_glDepthMask f, GLboolean flag) {
  207. f(flag);
  208. }
  209. static void glDisable(_glDisable f, GLenum cap) {
  210. f(cap);
  211. }
  212. static void glDisableVertexAttribArray(_glDisableVertexAttribArray f, GLuint index) {
  213. f(index);
  214. }
  215. static void glDrawArrays(_glDrawArrays f, GLenum mode, GLint first, GLsizei count) {
  216. f(mode, first, count);
  217. }
  218. // offset is defined as an uintptr_t to omit Cgo pointer checks.
  219. static void glDrawElements(_glDrawElements f, GLenum mode, GLsizei count, GLenum type, const uintptr_t offset) {
  220. f(mode, count, type, (const void *)offset);
  221. }
  222. static void glEnable(_glEnable f, GLenum cap) {
  223. f(cap);
  224. }
  225. static void glEnableVertexAttribArray(_glEnableVertexAttribArray f, GLuint index) {
  226. f(index);
  227. }
  228. static void glFinish(_glFinish f) {
  229. f();
  230. }
  231. static void glFlush(_glFlush f) {
  232. f();
  233. }
  234. static void glFramebufferRenderbuffer(_glFramebufferRenderbuffer f, GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer) {
  235. f(target, attachment, renderbuffertarget, renderbuffer);
  236. }
  237. static void glFramebufferTexture2D(_glFramebufferTexture2D f, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) {
  238. f(target, attachment, textarget, texture, level);
  239. }
  240. static void glGenBuffers(_glGenBuffers f, GLsizei n, GLuint *buffers) {
  241. f(n, buffers);
  242. }
  243. static void glGenerateMipmap(_glGenerateMipmap f, GLenum target) {
  244. f(target);
  245. }
  246. static void glGenFramebuffers(_glGenFramebuffers f, GLsizei n, GLuint *framebuffers) {
  247. f(n, framebuffers);
  248. }
  249. static void glGenRenderbuffers(_glGenRenderbuffers f, GLsizei n, GLuint *renderbuffers) {
  250. f(n, renderbuffers);
  251. }
  252. static void glGenTextures(_glGenTextures f, GLsizei n, GLuint *textures) {
  253. f(n, textures);
  254. }
  255. static GLenum glGetError(_glGetError f) {
  256. return f();
  257. }
  258. static void glGetFramebufferAttachmentParameteriv(_glGetFramebufferAttachmentParameteriv f, GLenum target, GLenum attachment, GLenum pname, GLint *params) {
  259. f(target, attachment, pname, params);
  260. }
  261. static void glGetIntegerv(_glGetIntegerv f, GLenum pname, GLint *data) {
  262. f(pname, data);
  263. }
  264. static void glGetFloatv(_glGetFloatv f, GLenum pname, GLfloat *data) {
  265. f(pname, data);
  266. }
  267. static void glGetIntegeri_v(_glGetIntegeri_v f, GLenum pname, GLuint idx, GLint *data) {
  268. f(pname, idx, data);
  269. }
  270. static void glGetProgramiv(_glGetProgramiv f, GLuint program, GLenum pname, GLint *params) {
  271. f(program, pname, params);
  272. }
  273. static void glGetProgramInfoLog(_glGetProgramInfoLog f, GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog) {
  274. f(program, bufSize, length, infoLog);
  275. }
  276. static void glGetRenderbufferParameteriv(_glGetRenderbufferParameteriv f, GLenum target, GLenum pname, GLint *params) {
  277. f(target, pname, params);
  278. }
  279. static void glGetShaderiv(_glGetShaderiv f, GLuint shader, GLenum pname, GLint *params) {
  280. f(shader, pname, params);
  281. }
  282. static void glGetShaderInfoLog(_glGetShaderInfoLog f, GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog) {
  283. f(shader, bufSize, length, infoLog);
  284. }
  285. static const GLubyte *glGetString(_glGetString f, GLenum name) {
  286. return f(name);
  287. }
  288. static GLint glGetUniformLocation(_glGetUniformLocation f, GLuint program, const GLchar *name) {
  289. return f(program, name);
  290. }
  291. static void glGetVertexAttribiv(_glGetVertexAttribiv f, GLuint index, GLenum pname, GLint *data) {
  292. f(index, pname, data);
  293. }
  294. // Return uintptr_t to avoid Cgo pointer check.
  295. static uintptr_t glGetVertexAttribPointerv(_glGetVertexAttribPointerv f, GLuint index, GLenum pname) {
  296. void *ptrs;
  297. f(index, pname, &ptrs);
  298. return (uintptr_t)ptrs;
  299. }
  300. static GLboolean glIsEnabled(_glIsEnabled f, GLenum cap) {
  301. return f(cap);
  302. }
  303. static void glLinkProgram(_glLinkProgram f, GLuint program) {
  304. f(program);
  305. }
  306. static void glPixelStorei(_glPixelStorei f, GLenum pname, GLint param) {
  307. f(pname, param);
  308. }
  309. static void glReadPixels(_glReadPixels f, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) {
  310. f(x, y, width, height, format, type, pixels);
  311. }
  312. static void glRenderbufferStorage(_glRenderbufferStorage f, GLenum target, GLenum internalformat, GLsizei width, GLsizei height) {
  313. f(target, internalformat, width, height);
  314. }
  315. static void glScissor(_glScissor f, GLint x, GLint y, GLsizei width, GLsizei height) {
  316. f(x, y, width, height);
  317. }
  318. static void glShaderSource(_glShaderSource f, GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length) {
  319. f(shader, count, string, length);
  320. }
  321. static void glTexImage2D(_glTexImage2D f, GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels) {
  322. f(target, level, internalformat, width, height, border, format, type, pixels);
  323. }
  324. static void glTexParameteri(_glTexParameteri f, GLenum target, GLenum pname, GLint param) {
  325. f(target, pname, param);
  326. }
  327. static void glTexSubImage2D(_glTexSubImage2D f, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels) {
  328. f(target, level, xoffset, yoffset, width, height, format, type, pixels);
  329. }
  330. static void glUniform1f(_glUniform1f f, GLint location, GLfloat v0) {
  331. f(location, v0);
  332. }
  333. static void glUniform1i(_glUniform1i f, GLint location, GLint v0) {
  334. f(location, v0);
  335. }
  336. static void glUniform2f(_glUniform2f f, GLint location, GLfloat v0, GLfloat v1) {
  337. f(location, v0, v1);
  338. }
  339. static void glUniform3f(_glUniform3f f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2) {
  340. f(location, v0, v1, v2);
  341. }
  342. static void glUniform4f(_glUniform4f f, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3) {
  343. f(location, v0, v1, v2, v3);
  344. }
  345. static void glUseProgram(_glUseProgram f, GLuint program) {
  346. f(program);
  347. }
  348. // offset is defined as an uintptr_t to omit Cgo pointer checks.
  349. static void glVertexAttribPointer(_glVertexAttribPointer f, GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, uintptr_t offset) {
  350. f(index, size, type, normalized, stride, (const void *)offset);
  351. }
  352. static void glViewport(_glViewport f, GLint x, GLint y, GLsizei width, GLsizei height) {
  353. f(x, y, width, height);
  354. }
  355. static void glBindBufferBase(_glBindBufferBase f, GLenum target, GLuint index, GLuint buffer) {
  356. f(target, index, buffer);
  357. }
  358. static void glUniformBlockBinding(_glUniformBlockBinding f, GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) {
  359. f(program, uniformBlockIndex, uniformBlockBinding);
  360. }
  361. static GLuint glGetUniformBlockIndex(_glGetUniformBlockIndex f, GLuint program, const GLchar *uniformBlockName) {
  362. return f(program, uniformBlockName);
  363. }
  364. static void glInvalidateFramebuffer(_glInvalidateFramebuffer f, GLenum target, GLenum attachment) {
  365. // Framebuffer invalidation is just a hint and can safely be ignored.
  366. if (f != NULL) {
  367. f(target, 1, &attachment);
  368. }
  369. }
  370. static void glBeginQuery(_glBeginQuery f, GLenum target, GLenum attachment) {
  371. f(target, attachment);
  372. }
  373. static void glDeleteQueries(_glDeleteQueries f, GLsizei n, const GLuint *ids) {
  374. f(n, ids);
  375. }
  376. static void glDeleteVertexArrays(_glDeleteVertexArrays f, GLsizei n, const GLuint *ids) {
  377. f(n, ids);
  378. }
  379. static void glEndQuery(_glEndQuery f, GLenum target) {
  380. f(target);
  381. }
  382. static const GLubyte* glGetStringi(_glGetStringi f, GLenum name, GLuint index) {
  383. return f(name, index);
  384. }
  385. static void glGenQueries(_glGenQueries f, GLsizei n, GLuint *ids) {
  386. f(n, ids);
  387. }
  388. static void glGenVertexArrays(_glGenVertexArrays f, GLsizei n, GLuint *ids) {
  389. f(n, ids);
  390. }
  391. static void glGetProgramBinary(_glGetProgramBinary f, GLuint program, GLsizei bufsize, GLsizei *length, GLenum *binaryFormat, void *binary) {
  392. f(program, bufsize, length, binaryFormat, binary);
  393. }
  394. static void glGetQueryObjectuiv(_glGetQueryObjectuiv f, GLuint id, GLenum pname, GLuint *params) {
  395. f(id, pname, params);
  396. }
  397. static void glMemoryBarrier(_glMemoryBarrier f, GLbitfield barriers) {
  398. f(barriers);
  399. }
  400. static void glDispatchCompute(_glDispatchCompute f, GLuint x, GLuint y, GLuint z) {
  401. f(x, y, z);
  402. }
  403. static void *glMapBufferRange(_glMapBufferRange f, GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access) {
  404. return f(target, offset, length, access);
  405. }
  406. static GLboolean glUnmapBuffer(_glUnmapBuffer f, GLenum target) {
  407. return f(target);
  408. }
  409. static void glBindImageTexture(_glBindImageTexture f, GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format) {
  410. f(unit, texture, level, layered, layer, access, format);
  411. }
  412. static void glTexStorage2D(_glTexStorage2D f, GLenum target, GLsizei levels, GLenum internalFormat, GLsizei width, GLsizei height) {
  413. f(target, levels, internalFormat, width, height);
  414. }
  415. static void glBlitFramebuffer(_glBlitFramebuffer f, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) {
  416. f(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
  417. }
  418. */
  419. import "C"
  420. type Context interface{}
  421. type Functions struct {
  422. // Query caches.
  423. uints [100]C.GLuint
  424. ints [100]C.GLint
  425. floats [100]C.GLfloat
  426. glActiveTexture C._glActiveTexture
  427. glAttachShader C._glAttachShader
  428. glBindAttribLocation C._glBindAttribLocation
  429. glBindBuffer C._glBindBuffer
  430. glBindFramebuffer C._glBindFramebuffer
  431. glBindRenderbuffer C._glBindRenderbuffer
  432. glBindTexture C._glBindTexture
  433. glBlendEquation C._glBlendEquation
  434. glBlendFuncSeparate C._glBlendFuncSeparate
  435. glBufferData C._glBufferData
  436. glBufferSubData C._glBufferSubData
  437. glCheckFramebufferStatus C._glCheckFramebufferStatus
  438. glClear C._glClear
  439. glClearColor C._glClearColor
  440. glClearDepthf C._glClearDepthf
  441. glCompileShader C._glCompileShader
  442. glCopyTexSubImage2D C._glCopyTexSubImage2D
  443. glCreateProgram C._glCreateProgram
  444. glCreateShader C._glCreateShader
  445. glDeleteBuffers C._glDeleteBuffers
  446. glDeleteFramebuffers C._glDeleteFramebuffers
  447. glDeleteProgram C._glDeleteProgram
  448. glDeleteRenderbuffers C._glDeleteRenderbuffers
  449. glDeleteShader C._glDeleteShader
  450. glDeleteTextures C._glDeleteTextures
  451. glDepthFunc C._glDepthFunc
  452. glDepthMask C._glDepthMask
  453. glDisable C._glDisable
  454. glDisableVertexAttribArray C._glDisableVertexAttribArray
  455. glDrawArrays C._glDrawArrays
  456. glDrawElements C._glDrawElements
  457. glEnable C._glEnable
  458. glEnableVertexAttribArray C._glEnableVertexAttribArray
  459. glFinish C._glFinish
  460. glFlush C._glFlush
  461. glFramebufferRenderbuffer C._glFramebufferRenderbuffer
  462. glFramebufferTexture2D C._glFramebufferTexture2D
  463. glGenBuffers C._glGenBuffers
  464. glGenerateMipmap C._glGenerateMipmap
  465. glGenFramebuffers C._glGenFramebuffers
  466. glGenRenderbuffers C._glGenRenderbuffers
  467. glGenTextures C._glGenTextures
  468. glGetError C._glGetError
  469. glGetFramebufferAttachmentParameteriv C._glGetFramebufferAttachmentParameteriv
  470. glGetFloatv C._glGetFloatv
  471. glGetIntegerv C._glGetIntegerv
  472. glGetIntegeri_v C._glGetIntegeri_v
  473. glGetProgramiv C._glGetProgramiv
  474. glGetProgramInfoLog C._glGetProgramInfoLog
  475. glGetRenderbufferParameteriv C._glGetRenderbufferParameteriv
  476. glGetShaderiv C._glGetShaderiv
  477. glGetShaderInfoLog C._glGetShaderInfoLog
  478. glGetString C._glGetString
  479. glGetUniformLocation C._glGetUniformLocation
  480. glGetVertexAttribiv C._glGetVertexAttribiv
  481. glGetVertexAttribPointerv C._glGetVertexAttribPointerv
  482. glIsEnabled C._glIsEnabled
  483. glLinkProgram C._glLinkProgram
  484. glPixelStorei C._glPixelStorei
  485. glReadPixels C._glReadPixels
  486. glRenderbufferStorage C._glRenderbufferStorage
  487. glScissor C._glScissor
  488. glShaderSource C._glShaderSource
  489. glTexImage2D C._glTexImage2D
  490. glTexParameteri C._glTexParameteri
  491. glTexSubImage2D C._glTexSubImage2D
  492. glUniform1f C._glUniform1f
  493. glUniform1i C._glUniform1i
  494. glUniform2f C._glUniform2f
  495. glUniform3f C._glUniform3f
  496. glUniform4f C._glUniform4f
  497. glUseProgram C._glUseProgram
  498. glVertexAttribPointer C._glVertexAttribPointer
  499. glViewport C._glViewport
  500. glBindVertexArray C._glBindVertexArray
  501. glBindBufferBase C._glBindBufferBase
  502. glGetUniformBlockIndex C._glGetUniformBlockIndex
  503. glUniformBlockBinding C._glUniformBlockBinding
  504. glInvalidateFramebuffer C._glInvalidateFramebuffer
  505. glBeginQuery C._glBeginQuery
  506. glDeleteQueries C._glDeleteQueries
  507. glDeleteVertexArrays C._glDeleteVertexArrays
  508. glEndQuery C._glEndQuery
  509. glGenQueries C._glGenQueries
  510. glGenVertexArrays C._glGenVertexArrays
  511. glGetProgramBinary C._glGetProgramBinary
  512. glGetQueryObjectuiv C._glGetQueryObjectuiv
  513. glGetStringi C._glGetStringi
  514. glDispatchCompute C._glDispatchCompute
  515. glMemoryBarrier C._glMemoryBarrier
  516. glMapBufferRange C._glMapBufferRange
  517. glUnmapBuffer C._glUnmapBuffer
  518. glBindImageTexture C._glBindImageTexture
  519. glTexStorage2D C._glTexStorage2D
  520. glBlitFramebuffer C._glBlitFramebuffer
  521. }
  522. func NewFunctions(ctx Context, forceES bool) (*Functions, error) {
  523. if ctx != nil {
  524. panic("non-nil context")
  525. }
  526. f := new(Functions)
  527. err := f.load(forceES)
  528. if err != nil {
  529. return nil, err
  530. }
  531. return f, nil
  532. }
  533. func dlsym(handle unsafe.Pointer, s string) unsafe.Pointer {
  534. cs := C.CString(s)
  535. defer C.free(unsafe.Pointer(cs))
  536. return C.dlsym(handle, cs)
  537. }
  538. func dlopen(lib string) unsafe.Pointer {
  539. clib := C.CString(lib)
  540. defer C.free(unsafe.Pointer(clib))
  541. return C.dlopen(clib, C.RTLD_NOW|C.RTLD_LOCAL)
  542. }
  543. func (f *Functions) load(forceES bool) error {
  544. var (
  545. loadErr error
  546. libNames []string
  547. handles []unsafe.Pointer
  548. )
  549. switch {
  550. case runtime.GOOS == "darwin" && !forceES:
  551. libNames = []string{"/System/Library/Frameworks/OpenGL.framework/OpenGL"}
  552. case runtime.GOOS == "darwin" && forceES:
  553. libNames = []string{"libGLESv2.dylib"}
  554. case runtime.GOOS == "ios":
  555. libNames = []string{"/System/Library/Frameworks/OpenGLES.framework/OpenGLES"}
  556. case runtime.GOOS == "android":
  557. libNames = []string{"libGLESv2.so", "libGLESv3.so"}
  558. default:
  559. libNames = []string{"libGLESv2.so.2", "libGLESv2.so.3.0"}
  560. }
  561. for _, lib := range libNames {
  562. if h := dlopen(lib); h != nil {
  563. handles = append(handles, h)
  564. }
  565. }
  566. if len(handles) == 0 {
  567. return fmt.Errorf("gl: no OpenGL implementation could be loaded (tried %q)", libNames)
  568. }
  569. load := func(s string) *[0]byte {
  570. for _, h := range handles {
  571. if f := dlsym(h, s); f != nil {
  572. return (*[0]byte)(f)
  573. }
  574. }
  575. return nil
  576. }
  577. must := func(s string) *[0]byte {
  578. ptr := load(s)
  579. if ptr == nil {
  580. loadErr = fmt.Errorf("gl: failed to load symbol %q", s)
  581. }
  582. return ptr
  583. }
  584. // GL ES 2.0 functions.
  585. f.glActiveTexture = must("glActiveTexture")
  586. f.glAttachShader = must("glAttachShader")
  587. f.glBindAttribLocation = must("glBindAttribLocation")
  588. f.glBindBuffer = must("glBindBuffer")
  589. f.glBindFramebuffer = must("glBindFramebuffer")
  590. f.glBindRenderbuffer = must("glBindRenderbuffer")
  591. f.glBindTexture = must("glBindTexture")
  592. f.glBlendEquation = must("glBlendEquation")
  593. f.glBlendFuncSeparate = must("glBlendFuncSeparate")
  594. f.glBufferData = must("glBufferData")
  595. f.glBufferSubData = must("glBufferSubData")
  596. f.glCheckFramebufferStatus = must("glCheckFramebufferStatus")
  597. f.glClear = must("glClear")
  598. f.glClearColor = must("glClearColor")
  599. f.glClearDepthf = must("glClearDepthf")
  600. f.glCompileShader = must("glCompileShader")
  601. f.glCopyTexSubImage2D = must("glCopyTexSubImage2D")
  602. f.glCreateProgram = must("glCreateProgram")
  603. f.glCreateShader = must("glCreateShader")
  604. f.glDeleteBuffers = must("glDeleteBuffers")
  605. f.glDeleteFramebuffers = must("glDeleteFramebuffers")
  606. f.glDeleteProgram = must("glDeleteProgram")
  607. f.glDeleteRenderbuffers = must("glDeleteRenderbuffers")
  608. f.glDeleteShader = must("glDeleteShader")
  609. f.glDeleteTextures = must("glDeleteTextures")
  610. f.glDepthFunc = must("glDepthFunc")
  611. f.glDepthMask = must("glDepthMask")
  612. f.glDisable = must("glDisable")
  613. f.glDisableVertexAttribArray = must("glDisableVertexAttribArray")
  614. f.glDrawArrays = must("glDrawArrays")
  615. f.glDrawElements = must("glDrawElements")
  616. f.glEnable = must("glEnable")
  617. f.glEnableVertexAttribArray = must("glEnableVertexAttribArray")
  618. f.glFinish = must("glFinish")
  619. f.glFlush = must("glFlush")
  620. f.glFramebufferRenderbuffer = must("glFramebufferRenderbuffer")
  621. f.glFramebufferTexture2D = must("glFramebufferTexture2D")
  622. f.glGenBuffers = must("glGenBuffers")
  623. f.glGenerateMipmap = must("glGenerateMipmap")
  624. f.glGenFramebuffers = must("glGenFramebuffers")
  625. f.glGenRenderbuffers = must("glGenRenderbuffers")
  626. f.glGenTextures = must("glGenTextures")
  627. f.glGetError = must("glGetError")
  628. f.glGetFramebufferAttachmentParameteriv = must("glGetFramebufferAttachmentParameteriv")
  629. f.glGetIntegerv = must("glGetIntegerv")
  630. f.glGetFloatv = must("glGetFloatv")
  631. f.glGetProgramiv = must("glGetProgramiv")
  632. f.glGetProgramInfoLog = must("glGetProgramInfoLog")
  633. f.glGetRenderbufferParameteriv = must("glGetRenderbufferParameteriv")
  634. f.glGetShaderiv = must("glGetShaderiv")
  635. f.glGetShaderInfoLog = must("glGetShaderInfoLog")
  636. f.glGetString = must("glGetString")
  637. f.glGetUniformLocation = must("glGetUniformLocation")
  638. f.glGetVertexAttribiv = must("glGetVertexAttribiv")
  639. f.glGetVertexAttribPointerv = must("glGetVertexAttribPointerv")
  640. f.glIsEnabled = must("glIsEnabled")
  641. f.glLinkProgram = must("glLinkProgram")
  642. f.glPixelStorei = must("glPixelStorei")
  643. f.glReadPixels = must("glReadPixels")
  644. f.glRenderbufferStorage = must("glRenderbufferStorage")
  645. f.glScissor = must("glScissor")
  646. f.glShaderSource = must("glShaderSource")
  647. f.glTexImage2D = must("glTexImage2D")
  648. f.glTexParameteri = must("glTexParameteri")
  649. f.glTexSubImage2D = must("glTexSubImage2D")
  650. f.glUniform1f = must("glUniform1f")
  651. f.glUniform1i = must("glUniform1i")
  652. f.glUniform2f = must("glUniform2f")
  653. f.glUniform3f = must("glUniform3f")
  654. f.glUniform4f = must("glUniform4f")
  655. f.glUseProgram = must("glUseProgram")
  656. f.glVertexAttribPointer = must("glVertexAttribPointer")
  657. f.glViewport = must("glViewport")
  658. // Extensions and GL ES 3 functions.
  659. f.glBindBufferBase = load("glBindBufferBase")
  660. f.glBindVertexArray = load("glBindVertexArray")
  661. f.glGetIntegeri_v = load("glGetIntegeri_v")
  662. f.glGetUniformBlockIndex = load("glGetUniformBlockIndex")
  663. f.glUniformBlockBinding = load("glUniformBlockBinding")
  664. f.glInvalidateFramebuffer = load("glInvalidateFramebuffer")
  665. f.glGetStringi = load("glGetStringi")
  666. // Fall back to EXT_invalidate_framebuffer if available.
  667. if f.glInvalidateFramebuffer == nil {
  668. f.glInvalidateFramebuffer = load("glDiscardFramebufferEXT")
  669. }
  670. f.glBeginQuery = load("glBeginQuery")
  671. if f.glBeginQuery == nil {
  672. f.glBeginQuery = load("glBeginQueryEXT")
  673. }
  674. f.glDeleteQueries = load("glDeleteQueries")
  675. if f.glDeleteQueries == nil {
  676. f.glDeleteQueries = load("glDeleteQueriesEXT")
  677. }
  678. f.glEndQuery = load("glEndQuery")
  679. if f.glEndQuery == nil {
  680. f.glEndQuery = load("glEndQueryEXT")
  681. }
  682. f.glGenQueries = load("glGenQueries")
  683. if f.glGenQueries == nil {
  684. f.glGenQueries = load("glGenQueriesEXT")
  685. }
  686. f.glGetQueryObjectuiv = load("glGetQueryObjectuiv")
  687. if f.glGetQueryObjectuiv == nil {
  688. f.glGetQueryObjectuiv = load("glGetQueryObjectuivEXT")
  689. }
  690. f.glDeleteVertexArrays = load("glDeleteVertexArrays")
  691. f.glGenVertexArrays = load("glGenVertexArrays")
  692. f.glMemoryBarrier = load("glMemoryBarrier")
  693. f.glDispatchCompute = load("glDispatchCompute")
  694. f.glMapBufferRange = load("glMapBufferRange")
  695. f.glUnmapBuffer = load("glUnmapBuffer")
  696. f.glBindImageTexture = load("glBindImageTexture")
  697. f.glTexStorage2D = load("glTexStorage2D")
  698. f.glBlitFramebuffer = load("glBlitFramebuffer")
  699. f.glGetProgramBinary = load("glGetProgramBinary")
  700. return loadErr
  701. }
  702. func (f *Functions) ActiveTexture(texture Enum) {
  703. C.glActiveTexture(f.glActiveTexture, C.GLenum(texture))
  704. }
  705. func (f *Functions) AttachShader(p Program, s Shader) {
  706. C.glAttachShader(f.glAttachShader, C.GLuint(p.V), C.GLuint(s.V))
  707. }
  708. func (f *Functions) BeginQuery(target Enum, query Query) {
  709. C.glBeginQuery(f.glBeginQuery, C.GLenum(target), C.GLenum(query.V))
  710. }
  711. func (f *Functions) BindAttribLocation(p Program, a Attrib, name string) {
  712. cname := C.CString(name)
  713. defer C.free(unsafe.Pointer(cname))
  714. C.glBindAttribLocation(f.glBindAttribLocation, C.GLuint(p.V), C.GLuint(a), cname)
  715. }
  716. func (f *Functions) BindBufferBase(target Enum, index int, b Buffer) {
  717. C.glBindBufferBase(f.glBindBufferBase, C.GLenum(target), C.GLuint(index), C.GLuint(b.V))
  718. }
  719. func (f *Functions) BindBuffer(target Enum, b Buffer) {
  720. C.glBindBuffer(f.glBindBuffer, C.GLenum(target), C.GLuint(b.V))
  721. }
  722. func (f *Functions) BindFramebuffer(target Enum, fb Framebuffer) {
  723. C.glBindFramebuffer(f.glBindFramebuffer, C.GLenum(target), C.GLuint(fb.V))
  724. }
  725. func (f *Functions) BindRenderbuffer(target Enum, fb Renderbuffer) {
  726. C.glBindRenderbuffer(f.glBindRenderbuffer, C.GLenum(target), C.GLuint(fb.V))
  727. }
  728. func (f *Functions) BindImageTexture(unit int, t Texture, level int, layered bool, layer int, access, format Enum) {
  729. l := C.GLboolean(FALSE)
  730. if layered {
  731. l = TRUE
  732. }
  733. C.glBindImageTexture(f.glBindImageTexture, C.GLuint(unit), C.GLuint(t.V), C.GLint(level), l, C.GLint(layer), C.GLenum(access), C.GLenum(format))
  734. }
  735. func (f *Functions) BindTexture(target Enum, t Texture) {
  736. C.glBindTexture(f.glBindTexture, C.GLenum(target), C.GLuint(t.V))
  737. }
  738. func (f *Functions) BindVertexArray(a VertexArray) {
  739. C.glBindVertexArray(f.glBindVertexArray, C.GLuint(a.V))
  740. }
  741. func (f *Functions) BlendEquation(mode Enum) {
  742. C.glBlendEquation(f.glBlendEquation, C.GLenum(mode))
  743. }
  744. func (f *Functions) BlendFuncSeparate(srcRGB, dstRGB, srcA, dstA Enum) {
  745. C.glBlendFuncSeparate(f.glBlendFuncSeparate, C.GLenum(srcRGB), C.GLenum(dstRGB), C.GLenum(srcA), C.GLenum(dstA))
  746. }
  747. func (f *Functions) BlitFramebuffer(sx0, sy0, sx1, sy1, dx0, dy0, dx1, dy1 int, mask Enum, filter Enum) {
  748. C.glBlitFramebuffer(f.glBlitFramebuffer,
  749. C.GLint(sx0), C.GLint(sy0), C.GLint(sx1), C.GLint(sy1),
  750. C.GLint(dx0), C.GLint(dy0), C.GLint(dx1), C.GLint(dy1),
  751. C.GLenum(mask), C.GLenum(filter),
  752. )
  753. }
  754. func (f *Functions) BufferData(target Enum, size int, usage Enum, data []byte) {
  755. var p unsafe.Pointer
  756. if len(data) > 0 {
  757. p = unsafe.Pointer(&data[0])
  758. }
  759. C.glBufferData(f.glBufferData, C.GLenum(target), C.GLsizeiptr(size), p, C.GLenum(usage))
  760. }
  761. func (f *Functions) BufferSubData(target Enum, offset int, src []byte) {
  762. var p unsafe.Pointer
  763. if len(src) > 0 {
  764. p = unsafe.Pointer(&src[0])
  765. }
  766. C.glBufferSubData(f.glBufferSubData, C.GLenum(target), C.GLintptr(offset), C.GLsizeiptr(len(src)), p)
  767. }
  768. func (f *Functions) CheckFramebufferStatus(target Enum) Enum {
  769. return Enum(C.glCheckFramebufferStatus(f.glCheckFramebufferStatus, C.GLenum(target)))
  770. }
  771. func (f *Functions) Clear(mask Enum) {
  772. C.glClear(f.glClear, C.GLbitfield(mask))
  773. }
  774. func (f *Functions) ClearColor(red float32, green float32, blue float32, alpha float32) {
  775. C.glClearColor(f.glClearColor, C.GLfloat(red), C.GLfloat(green), C.GLfloat(blue), C.GLfloat(alpha))
  776. }
  777. func (f *Functions) ClearDepthf(d float32) {
  778. C.glClearDepthf(f.glClearDepthf, C.GLfloat(d))
  779. }
  780. func (f *Functions) CompileShader(s Shader) {
  781. C.glCompileShader(f.glCompileShader, C.GLuint(s.V))
  782. }
  783. func (f *Functions) CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) {
  784. C.glCopyTexSubImage2D(f.glCopyTexSubImage2D, C.GLenum(target), C.GLint(level), C.GLint(xoffset), C.GLint(yoffset), C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height))
  785. }
  786. func (f *Functions) CreateBuffer() Buffer {
  787. C.glGenBuffers(f.glGenBuffers, 1, &f.uints[0])
  788. return Buffer{uint(f.uints[0])}
  789. }
  790. func (f *Functions) CreateFramebuffer() Framebuffer {
  791. C.glGenFramebuffers(f.glGenFramebuffers, 1, &f.uints[0])
  792. return Framebuffer{uint(f.uints[0])}
  793. }
  794. func (f *Functions) CreateProgram() Program {
  795. return Program{uint(C.glCreateProgram(f.glCreateProgram))}
  796. }
  797. func (f *Functions) CreateQuery() Query {
  798. C.glGenQueries(f.glGenQueries, 1, &f.uints[0])
  799. return Query{uint(f.uints[0])}
  800. }
  801. func (f *Functions) CreateRenderbuffer() Renderbuffer {
  802. C.glGenRenderbuffers(f.glGenRenderbuffers, 1, &f.uints[0])
  803. return Renderbuffer{uint(f.uints[0])}
  804. }
  805. func (f *Functions) CreateShader(ty Enum) Shader {
  806. return Shader{uint(C.glCreateShader(f.glCreateShader, C.GLenum(ty)))}
  807. }
  808. func (f *Functions) CreateTexture() Texture {
  809. C.glGenTextures(f.glGenTextures, 1, &f.uints[0])
  810. return Texture{uint(f.uints[0])}
  811. }
  812. func (f *Functions) CreateVertexArray() VertexArray {
  813. C.glGenVertexArrays(f.glGenVertexArrays, 1, &f.uints[0])
  814. return VertexArray{uint(f.uints[0])}
  815. }
  816. func (f *Functions) DeleteBuffer(v Buffer) {
  817. f.uints[0] = C.GLuint(v.V)
  818. C.glDeleteBuffers(f.glDeleteBuffers, 1, &f.uints[0])
  819. }
  820. func (f *Functions) DeleteFramebuffer(v Framebuffer) {
  821. f.uints[0] = C.GLuint(v.V)
  822. C.glDeleteFramebuffers(f.glDeleteFramebuffers, 1, &f.uints[0])
  823. }
  824. func (f *Functions) DeleteProgram(p Program) {
  825. C.glDeleteProgram(f.glDeleteProgram, C.GLuint(p.V))
  826. }
  827. func (f *Functions) DeleteQuery(query Query) {
  828. f.uints[0] = C.GLuint(query.V)
  829. C.glDeleteQueries(f.glDeleteQueries, 1, &f.uints[0])
  830. }
  831. func (f *Functions) DeleteVertexArray(array VertexArray) {
  832. f.uints[0] = C.GLuint(array.V)
  833. C.glDeleteVertexArrays(f.glDeleteVertexArrays, 1, &f.uints[0])
  834. }
  835. func (f *Functions) DeleteRenderbuffer(v Renderbuffer) {
  836. f.uints[0] = C.GLuint(v.V)
  837. C.glDeleteRenderbuffers(f.glDeleteRenderbuffers, 1, &f.uints[0])
  838. }
  839. func (f *Functions) DeleteShader(s Shader) {
  840. C.glDeleteShader(f.glDeleteShader, C.GLuint(s.V))
  841. }
  842. func (f *Functions) DeleteTexture(v Texture) {
  843. f.uints[0] = C.GLuint(v.V)
  844. C.glDeleteTextures(f.glDeleteTextures, 1, &f.uints[0])
  845. }
  846. func (f *Functions) DepthFunc(v Enum) {
  847. C.glDepthFunc(f.glDepthFunc, C.GLenum(v))
  848. }
  849. func (f *Functions) DepthMask(mask bool) {
  850. m := C.GLboolean(FALSE)
  851. if mask {
  852. m = C.GLboolean(TRUE)
  853. }
  854. C.glDepthMask(f.glDepthMask, m)
  855. }
  856. func (f *Functions) DisableVertexAttribArray(a Attrib) {
  857. C.glDisableVertexAttribArray(f.glDisableVertexAttribArray, C.GLuint(a))
  858. }
  859. func (f *Functions) Disable(cap Enum) {
  860. C.glDisable(f.glDisable, C.GLenum(cap))
  861. }
  862. func (f *Functions) DrawArrays(mode Enum, first int, count int) {
  863. C.glDrawArrays(f.glDrawArrays, C.GLenum(mode), C.GLint(first), C.GLsizei(count))
  864. }
  865. func (f *Functions) DrawElements(mode Enum, count int, ty Enum, offset int) {
  866. C.glDrawElements(f.glDrawElements, C.GLenum(mode), C.GLsizei(count), C.GLenum(ty), C.uintptr_t(offset))
  867. }
  868. func (f *Functions) DispatchCompute(x, y, z int) {
  869. C.glDispatchCompute(f.glDispatchCompute, C.GLuint(x), C.GLuint(y), C.GLuint(z))
  870. }
  871. func (f *Functions) Enable(cap Enum) {
  872. C.glEnable(f.glEnable, C.GLenum(cap))
  873. }
  874. func (f *Functions) EndQuery(target Enum) {
  875. C.glEndQuery(f.glEndQuery, C.GLenum(target))
  876. }
  877. func (f *Functions) EnableVertexAttribArray(a Attrib) {
  878. C.glEnableVertexAttribArray(f.glEnableVertexAttribArray, C.GLuint(a))
  879. }
  880. func (f *Functions) Finish() {
  881. C.glFinish(f.glFinish)
  882. }
  883. func (f *Functions) Flush() {
  884. C.glFlush(f.glFinish)
  885. }
  886. func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarget Enum, renderbuffer Renderbuffer) {
  887. C.glFramebufferRenderbuffer(f.glFramebufferRenderbuffer, C.GLenum(target), C.GLenum(attachment), C.GLenum(renderbuffertarget), C.GLuint(renderbuffer.V))
  888. }
  889. func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
  890. C.glFramebufferTexture2D(f.glFramebufferTexture2D, C.GLenum(target), C.GLenum(attachment), C.GLenum(texTarget), C.GLuint(t.V), C.GLint(level))
  891. }
  892. func (f *Functions) GenerateMipmap(target Enum) {
  893. C.glGenerateMipmap(f.glGenerateMipmap, C.GLenum(target))
  894. }
  895. func (c *Functions) GetBinding(pname Enum) Object {
  896. return Object{uint(c.GetInteger(pname))}
  897. }
  898. func (c *Functions) GetBindingi(pname Enum, idx int) Object {
  899. return Object{uint(c.GetIntegeri(pname, idx))}
  900. }
  901. func (f *Functions) GetError() Enum {
  902. return Enum(C.glGetError(f.glGetError))
  903. }
  904. func (f *Functions) GetRenderbufferParameteri(target, pname Enum) int {
  905. C.glGetRenderbufferParameteriv(f.glGetRenderbufferParameteriv, C.GLenum(target), C.GLenum(pname), &f.ints[0])
  906. return int(f.ints[0])
  907. }
  908. func (f *Functions) GetFramebufferAttachmentParameteri(target, attachment, pname Enum) int {
  909. C.glGetFramebufferAttachmentParameteriv(f.glGetFramebufferAttachmentParameteriv, C.GLenum(target), C.GLenum(attachment), C.GLenum(pname), &f.ints[0])
  910. return int(f.ints[0])
  911. }
  912. func (f *Functions) GetFloat4(pname Enum) [4]float32 {
  913. C.glGetFloatv(f.glGetFloatv, C.GLenum(pname), &f.floats[0])
  914. var r [4]float32
  915. for i := range r {
  916. r[i] = float32(f.floats[i])
  917. }
  918. return r
  919. }
  920. func (f *Functions) GetFloat(pname Enum) float32 {
  921. C.glGetFloatv(f.glGetFloatv, C.GLenum(pname), &f.floats[0])
  922. return float32(f.floats[0])
  923. }
  924. func (f *Functions) GetInteger4(pname Enum) [4]int {
  925. C.glGetIntegerv(f.glGetIntegerv, C.GLenum(pname), &f.ints[0])
  926. var r [4]int
  927. for i := range r {
  928. r[i] = int(f.ints[i])
  929. }
  930. return r
  931. }
  932. func (f *Functions) GetInteger(pname Enum) int {
  933. C.glGetIntegerv(f.glGetIntegerv, C.GLenum(pname), &f.ints[0])
  934. return int(f.ints[0])
  935. }
  936. func (f *Functions) GetIntegeri(pname Enum, idx int) int {
  937. C.glGetIntegeri_v(f.glGetIntegeri_v, C.GLenum(pname), C.GLuint(idx), &f.ints[0])
  938. return int(f.ints[0])
  939. }
  940. func (f *Functions) GetProgrami(p Program, pname Enum) int {
  941. C.glGetProgramiv(f.glGetProgramiv, C.GLuint(p.V), C.GLenum(pname), &f.ints[0])
  942. return int(f.ints[0])
  943. }
  944. func (f *Functions) GetProgramBinary(p Program) []byte {
  945. sz := f.GetProgrami(p, PROGRAM_BINARY_LENGTH)
  946. if sz == 0 {
  947. return nil
  948. }
  949. buf := make([]byte, sz)
  950. var format C.GLenum
  951. C.glGetProgramBinary(f.glGetProgramBinary, C.GLuint(p.V), C.GLsizei(sz), nil, &format, unsafe.Pointer(&buf[0]))
  952. return buf
  953. }
  954. func (f *Functions) GetProgramInfoLog(p Program) string {
  955. n := f.GetProgrami(p, INFO_LOG_LENGTH)
  956. buf := make([]byte, n)
  957. C.glGetProgramInfoLog(f.glGetProgramInfoLog, C.GLuint(p.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0])))
  958. return string(buf)
  959. }
  960. func (f *Functions) GetQueryObjectuiv(query Query, pname Enum) uint {
  961. C.glGetQueryObjectuiv(f.glGetQueryObjectuiv, C.GLuint(query.V), C.GLenum(pname), &f.uints[0])
  962. return uint(f.uints[0])
  963. }
  964. func (f *Functions) GetShaderi(s Shader, pname Enum) int {
  965. C.glGetShaderiv(f.glGetShaderiv, C.GLuint(s.V), C.GLenum(pname), &f.ints[0])
  966. return int(f.ints[0])
  967. }
  968. func (f *Functions) GetShaderInfoLog(s Shader) string {
  969. n := f.GetShaderi(s, INFO_LOG_LENGTH)
  970. buf := make([]byte, n)
  971. C.glGetShaderInfoLog(f.glGetShaderInfoLog, C.GLuint(s.V), C.GLsizei(len(buf)), nil, (*C.GLchar)(unsafe.Pointer(&buf[0])))
  972. return string(buf)
  973. }
  974. func (f *Functions) getStringi(pname Enum, index int) string {
  975. str := C.glGetStringi(f.glGetStringi, C.GLenum(pname), C.GLuint(index))
  976. if str == nil {
  977. return ""
  978. }
  979. return C.GoString((*C.char)(unsafe.Pointer(str)))
  980. }
  981. func (f *Functions) GetString(pname Enum) string {
  982. switch {
  983. case runtime.GOOS == "darwin" && pname == EXTENSIONS:
  984. // macOS OpenGL 3 core profile doesn't support glGetString(GL_EXTENSIONS).
  985. // Use glGetStringi(GL_EXTENSIONS, <index>).
  986. var exts []string
  987. nexts := f.GetInteger(NUM_EXTENSIONS)
  988. for i := 0; i < nexts; i++ {
  989. ext := f.getStringi(EXTENSIONS, i)
  990. exts = append(exts, ext)
  991. }
  992. return strings.Join(exts, " ")
  993. default:
  994. str := C.glGetString(f.glGetString, C.GLenum(pname))
  995. return C.GoString((*C.char)(unsafe.Pointer(str)))
  996. }
  997. }
  998. func (f *Functions) GetUniformBlockIndex(p Program, name string) uint {
  999. cname := C.CString(name)
  1000. defer C.free(unsafe.Pointer(cname))
  1001. return uint(C.glGetUniformBlockIndex(f.glGetUniformBlockIndex, C.GLuint(p.V), cname))
  1002. }
  1003. func (f *Functions) GetUniformLocation(p Program, name string) Uniform {
  1004. cname := C.CString(name)
  1005. defer C.free(unsafe.Pointer(cname))
  1006. return Uniform{int(C.glGetUniformLocation(f.glGetUniformLocation, C.GLuint(p.V), cname))}
  1007. }
  1008. func (f *Functions) GetVertexAttrib(index int, pname Enum) int {
  1009. C.glGetVertexAttribiv(f.glGetVertexAttribiv, C.GLuint(index), C.GLenum(pname), &f.ints[0])
  1010. return int(f.ints[0])
  1011. }
  1012. func (f *Functions) GetVertexAttribBinding(index int, pname Enum) Object {
  1013. return Object{uint(f.GetVertexAttrib(index, pname))}
  1014. }
  1015. func (f *Functions) GetVertexAttribPointer(index int, pname Enum) uintptr {
  1016. ptr := C.glGetVertexAttribPointerv(f.glGetVertexAttribPointerv, C.GLuint(index), C.GLenum(pname))
  1017. return uintptr(ptr)
  1018. }
  1019. func (f *Functions) InvalidateFramebuffer(target, attachment Enum) {
  1020. C.glInvalidateFramebuffer(f.glInvalidateFramebuffer, C.GLenum(target), C.GLenum(attachment))
  1021. }
  1022. func (f *Functions) IsEnabled(cap Enum) bool {
  1023. return C.glIsEnabled(f.glIsEnabled, C.GLenum(cap)) == TRUE
  1024. }
  1025. func (f *Functions) LinkProgram(p Program) {
  1026. C.glLinkProgram(f.glLinkProgram, C.GLuint(p.V))
  1027. }
  1028. func (f *Functions) PixelStorei(pname Enum, param int) {
  1029. C.glPixelStorei(f.glPixelStorei, C.GLenum(pname), C.GLint(param))
  1030. }
  1031. func (f *Functions) MemoryBarrier(barriers Enum) {
  1032. C.glMemoryBarrier(f.glMemoryBarrier, C.GLbitfield(barriers))
  1033. }
  1034. func (f *Functions) MapBufferRange(target Enum, offset, length int, access Enum) []byte {
  1035. p := C.glMapBufferRange(f.glMapBufferRange, C.GLenum(target), C.GLintptr(offset), C.GLsizeiptr(length), C.GLbitfield(access))
  1036. if p == nil {
  1037. return nil
  1038. }
  1039. return (*[1 << 30]byte)(p)[:length:length]
  1040. }
  1041. func (f *Functions) Scissor(x, y, width, height int32) {
  1042. C.glScissor(f.glScissor, C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height))
  1043. }
  1044. func (f *Functions) ReadPixels(x, y, width, height int, format, ty Enum, data []byte) {
  1045. var p unsafe.Pointer
  1046. if len(data) > 0 {
  1047. p = unsafe.Pointer(&data[0])
  1048. }
  1049. C.glReadPixels(f.glReadPixels, C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p)
  1050. }
  1051. func (f *Functions) RenderbufferStorage(target, internalformat Enum, width, height int) {
  1052. C.glRenderbufferStorage(f.glRenderbufferStorage, C.GLenum(target), C.GLenum(internalformat), C.GLsizei(width), C.GLsizei(height))
  1053. }
  1054. func (f *Functions) ShaderSource(s Shader, src string) {
  1055. csrc := C.CString(src)
  1056. defer C.free(unsafe.Pointer(csrc))
  1057. strlen := C.GLint(len(src))
  1058. C.glShaderSource(f.glShaderSource, C.GLuint(s.V), 1, &csrc, &strlen)
  1059. }
  1060. func (f *Functions) TexImage2D(target Enum, level int, internalFormat Enum, width int, height int, format Enum, ty Enum) {
  1061. C.glTexImage2D(f.glTexImage2D, C.GLenum(target), C.GLint(level), C.GLint(internalFormat), C.GLsizei(width), C.GLsizei(height), 0, C.GLenum(format), C.GLenum(ty), nil)
  1062. }
  1063. func (f *Functions) TexStorage2D(target Enum, levels int, internalFormat Enum, width, height int) {
  1064. C.glTexStorage2D(f.glTexStorage2D, C.GLenum(target), C.GLsizei(levels), C.GLenum(internalFormat), C.GLsizei(width), C.GLsizei(height))
  1065. }
  1066. func (f *Functions) TexSubImage2D(target Enum, level int, x int, y int, width int, height int, format Enum, ty Enum, data []byte) {
  1067. var p unsafe.Pointer
  1068. if len(data) > 0 {
  1069. p = unsafe.Pointer(&data[0])
  1070. }
  1071. C.glTexSubImage2D(f.glTexSubImage2D, C.GLenum(target), C.GLint(level), C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height), C.GLenum(format), C.GLenum(ty), p)
  1072. }
  1073. func (f *Functions) TexParameteri(target, pname Enum, param int) {
  1074. C.glTexParameteri(f.glTexParameteri, C.GLenum(target), C.GLenum(pname), C.GLint(param))
  1075. }
  1076. func (f *Functions) UniformBlockBinding(p Program, uniformBlockIndex uint, uniformBlockBinding uint) {
  1077. C.glUniformBlockBinding(f.glUniformBlockBinding, C.GLuint(p.V), C.GLuint(uniformBlockIndex), C.GLuint(uniformBlockBinding))
  1078. }
  1079. func (f *Functions) Uniform1f(dst Uniform, v float32) {
  1080. C.glUniform1f(f.glUniform1f, C.GLint(dst.V), C.GLfloat(v))
  1081. }
  1082. func (f *Functions) Uniform1i(dst Uniform, v int) {
  1083. C.glUniform1i(f.glUniform1i, C.GLint(dst.V), C.GLint(v))
  1084. }
  1085. func (f *Functions) Uniform2f(dst Uniform, v0 float32, v1 float32) {
  1086. C.glUniform2f(f.glUniform2f, C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1))
  1087. }
  1088. func (f *Functions) Uniform3f(dst Uniform, v0 float32, v1 float32, v2 float32) {
  1089. C.glUniform3f(f.glUniform3f, C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2))
  1090. }
  1091. func (f *Functions) Uniform4f(dst Uniform, v0 float32, v1 float32, v2 float32, v3 float32) {
  1092. C.glUniform4f(f.glUniform4f, C.GLint(dst.V), C.GLfloat(v0), C.GLfloat(v1), C.GLfloat(v2), C.GLfloat(v3))
  1093. }
  1094. func (f *Functions) UseProgram(p Program) {
  1095. C.glUseProgram(f.glUseProgram, C.GLuint(p.V))
  1096. }
  1097. func (f *Functions) UnmapBuffer(target Enum) bool {
  1098. r := C.glUnmapBuffer(f.glUnmapBuffer, C.GLenum(target))
  1099. return r == TRUE
  1100. }
  1101. func (f *Functions) VertexAttribPointer(dst Attrib, size int, ty Enum, normalized bool, stride int, offset int) {
  1102. var n C.GLboolean = FALSE
  1103. if normalized {
  1104. n = TRUE
  1105. }
  1106. C.glVertexAttribPointer(f.glVertexAttribPointer, C.GLuint(dst), C.GLint(size), C.GLenum(ty), n, C.GLsizei(stride), C.uintptr_t(offset))
  1107. }
  1108. func (f *Functions) Viewport(x int, y int, width int, height int) {
  1109. C.glViewport(f.glViewport, C.GLint(x), C.GLint(y), C.GLsizei(width), C.GLsizei(height))
  1110. }