gl.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751
  1. #define HL_NAME(n) sdl_##n
  2. #include <hl.h>
  3. #if defined(HL_IOS) || defined (HL_TVOS)
  4. # include <SDL.h>
  5. # include <SDL_syswm.h>
  6. # include <OpenGLES/ES3/gl.h>
  7. # define HL_GLES
  8. #elif defined(HL_MAC)
  9. # include <SDL.h>
  10. # include <OpenGL/gl3.h>
  11. # define glBindImageTexture(...) hl_error("Not supported on OSX")
  12. # define glDispatchCompute(...) hl_error("Not supported on OSX")
  13. # define glMemoryBarrier(...) hl_error("Not supported on OSX")
  14. #elif defined(_WIN32)
  15. # include <SDL.h>
  16. # include <GL/GLU.h>
  17. # include <glext.h>
  18. #elif defined(HL_CONSOLE)
  19. # include <graphic/glapi.h>
  20. #elif defined(HL_MESA)
  21. # include <GLES3/gl3.h>
  22. # include <GL/osmesa.h>
  23. # define HL_GLES
  24. #elif defined(HL_ANDROID)
  25. # include <SDL.h>
  26. # include <GLES3/gl3.h>
  27. # include <GLES3/gl3ext.h>
  28. # define HL_GLES
  29. #else
  30. # include <SDL2/SDL.h>
  31. # include <GL/glu.h>
  32. # include <GL/glext.h>
  33. #endif
  34. #ifdef HL_GLES
  35. # define GL_IMPORT(fun, t)
  36. # define ES_NOT_SUPPORTED hl_error("Not supported by GLES3")
  37. # define glBindFragDataLocation(...) ES_NOT_SUPPORTED
  38. # define glBindImageTexture(...) ES_NOT_SUPPORTED
  39. # define glTexImage2DMultisample(...) ES_NOT_SUPPORTED
  40. # define glFramebufferTexture(...) ES_NOT_SUPPORTED
  41. # define glDispatchCompute(...) ES_NOT_SUPPORTED
  42. # define glMemoryBarrier(...) ES_NOT_SUPPORTED
  43. # define glPolygonMode(face,mode) if( mode != 0x1B02 ) ES_NOT_SUPPORTED
  44. # define glGetQueryObjectiv glGetQueryObjectuiv
  45. # define glClearDepth glClearDepthf
  46. #endif
  47. #if !defined(HL_CONSOLE) && !defined(GL_IMPORT)
  48. #define GL_IMPORT(fun, t) PFNGL##t##PROC fun
  49. #include "GLImports.h"
  50. #undef GL_IMPORT
  51. #define GL_IMPORT(fun,t) fun = (PFNGL##t##PROC)SDL_GL_GetProcAddress(#fun); if( fun == NULL ) return 1
  52. #endif
  53. static int GLLoadAPI() {
  54. # include "GLImports.h"
  55. return 0;
  56. }
  57. #define ZIDX(val) ((val)?(val)->v.i:0)
  58. // globals
  59. HL_PRIM bool HL_NAME(gl_init)() {
  60. return GLLoadAPI() == 0;
  61. }
  62. HL_PRIM bool HL_NAME(gl_is_context_lost)() {
  63. // seems like a GL context is rarely lost on desktop
  64. // let's look at it again on mobile
  65. return false;
  66. }
  67. HL_PRIM void HL_NAME(gl_clear)( int bits ) {
  68. glClear(bits);
  69. }
  70. HL_PRIM int HL_NAME(gl_get_error)() {
  71. return glGetError();
  72. }
  73. HL_PRIM void HL_NAME(gl_scissor)( int x, int y, int width, int height ) {
  74. glScissor(x, y, width, height);
  75. }
  76. HL_PRIM void HL_NAME(gl_clear_color)( double r, double g, double b, double a ) {
  77. glClearColor((float)r, (float)g, (float)b, (float)a);
  78. }
  79. HL_PRIM void HL_NAME(gl_clear_depth)( double value ) {
  80. glClearDepth(value);
  81. }
  82. HL_PRIM void HL_NAME(gl_clear_stencil)( int value ) {
  83. glClearStencil(value);
  84. }
  85. HL_PRIM void HL_NAME(gl_viewport)( int x, int y, int width, int height ) {
  86. glViewport(x, y, width, height);
  87. }
  88. HL_PRIM void HL_NAME(gl_flush)() {
  89. glFlush();
  90. }
  91. HL_PRIM void HL_NAME(gl_finish)() {
  92. glFinish();
  93. }
  94. HL_PRIM void HL_NAME(gl_pixel_storei)( int key, int value ) {
  95. glPixelStorei(key, value);
  96. }
  97. HL_PRIM vbyte *HL_NAME(gl_get_string)(int name) {
  98. return (vbyte*)glGetString(name);
  99. }
  100. // state changes
  101. HL_PRIM void HL_NAME(gl_polygon_mode)(int face, int mode) {
  102. glPolygonMode(face, mode);
  103. }
  104. HL_PRIM void HL_NAME(gl_enable)( int feature ) {
  105. glEnable(feature);
  106. }
  107. HL_PRIM void HL_NAME(gl_disable)( int feature ) {
  108. glDisable(feature);
  109. }
  110. HL_PRIM void HL_NAME(gl_cull_face)( int face ) {
  111. glCullFace(face);
  112. }
  113. HL_PRIM void HL_NAME(gl_blend_func)( int src, int dst ) {
  114. glBlendFunc(src, dst);
  115. }
  116. HL_PRIM void HL_NAME(gl_blend_func_separate)( int src, int dst, int alphaSrc, int alphaDst ) {
  117. glBlendFuncSeparate(src, dst, alphaSrc, alphaDst);
  118. }
  119. HL_PRIM void HL_NAME(gl_blend_equation)( int op ) {
  120. glBlendEquation(op);
  121. }
  122. HL_PRIM void HL_NAME(gl_blend_equation_separate)( int op, int alphaOp ) {
  123. glBlendEquationSeparate(op, alphaOp);
  124. }
  125. HL_PRIM void HL_NAME(gl_depth_mask)( bool mask ) {
  126. glDepthMask(mask);
  127. }
  128. HL_PRIM void HL_NAME(gl_depth_func)( int f ) {
  129. glDepthFunc(f);
  130. }
  131. HL_PRIM void HL_NAME(gl_color_mask)( bool r, bool g, bool b, bool a ) {
  132. glColorMask(r, g, b, a);
  133. }
  134. HL_PRIM void HL_NAME(gl_stencil_mask_separate)(int face, int mask) {
  135. glStencilMaskSeparate(face, mask);
  136. }
  137. HL_PRIM void HL_NAME(gl_stencil_func_separate)(int face, int func, int ref, int mask ) {
  138. glStencilFuncSeparate(face, func, ref, mask);
  139. }
  140. HL_PRIM void HL_NAME(gl_stencil_op_separate)(int face, int sfail, int dpfail, int dppass) {
  141. glStencilOpSeparate(face, sfail, dpfail, dppass);
  142. }
  143. // program
  144. static vdynamic *alloc_i32(int v) {
  145. vdynamic *ret;
  146. ret = hl_alloc_dynamic(&hlt_i32);
  147. ret->v.i = v;
  148. return ret;
  149. }
  150. HL_PRIM vdynamic *HL_NAME(gl_create_program)() {
  151. int v = glCreateProgram();
  152. if( v == 0 ) return NULL;
  153. return alloc_i32(v);
  154. }
  155. HL_PRIM void HL_NAME(gl_delete_program)( vdynamic *s ) {
  156. glDeleteProgram(s->v.i);
  157. }
  158. HL_PRIM void HL_NAME(gl_bind_frag_data_location)( vdynamic *p, int colNum, vstring *name ) {
  159. char *cname = hl_to_utf8(name->bytes);
  160. glBindFragDataLocation(p->v.i, colNum, cname);
  161. }
  162. HL_PRIM void HL_NAME(gl_attach_shader)( vdynamic *p, vdynamic *s ) {
  163. glAttachShader(p->v.i, s->v.i);
  164. }
  165. HL_PRIM void HL_NAME(gl_link_program)( vdynamic *p ) {
  166. glLinkProgram(p->v.i);
  167. }
  168. HL_PRIM vdynamic *HL_NAME(gl_get_program_parameter)( vdynamic *p, int param ) {
  169. switch( param ) {
  170. case 0x8B82 /*LINK_STATUS*/ : {
  171. int ret = 0;
  172. glGetProgramiv(p->v.i, param, &ret);
  173. return alloc_i32(ret);
  174. }
  175. default:
  176. hl_error("Unsupported param %d",param);
  177. }
  178. return NULL;
  179. }
  180. HL_PRIM vbyte *HL_NAME(gl_get_program_info_bytes)( vdynamic *p ) {
  181. char log[4096];
  182. *log = 0;
  183. glGetProgramInfoLog(p->v.i, 4096, NULL, log);
  184. return hl_copy_bytes((vbyte*)log,(int)strlen(log) + 1);
  185. }
  186. HL_PRIM vdynamic *HL_NAME(gl_get_uniform_location)( vdynamic *p, vstring *name ) {
  187. char *cname = hl_to_utf8(name->bytes);
  188. int u = glGetUniformLocation(p->v.i, cname);
  189. if( u < 0 ) return NULL;
  190. return alloc_i32(u);
  191. }
  192. HL_PRIM int HL_NAME(gl_get_attrib_location)( vdynamic *p, vstring *name ) {
  193. char *cname = hl_to_utf8(name->bytes);
  194. return glGetAttribLocation(p->v.i, cname);
  195. }
  196. HL_PRIM void HL_NAME(gl_use_program)( vdynamic *p ) {
  197. glUseProgram(ZIDX(p));
  198. }
  199. // shader
  200. HL_PRIM vdynamic *HL_NAME(gl_create_shader)( int type ) {
  201. int s = glCreateShader(type);
  202. if (s == 0) return NULL;
  203. return alloc_i32(s);
  204. }
  205. HL_PRIM void HL_NAME(gl_shader_source)( vdynamic *s, vstring *src ) {
  206. const GLchar *c = (GLchar*)hl_to_utf8(src->bytes);
  207. glShaderSource(s->v.i, 1, &c, NULL);
  208. }
  209. HL_PRIM void HL_NAME(gl_compile_shader)( vdynamic *s ) {
  210. glCompileShader(s->v.i);
  211. }
  212. HL_PRIM vbyte *HL_NAME(gl_get_shader_info_bytes)( vdynamic *s ) {
  213. char log[4096];
  214. *log = 0;
  215. glGetShaderInfoLog(s->v.i, 4096, NULL, log);
  216. return hl_copy_bytes((vbyte*)log, (int)strlen(log)+1);
  217. }
  218. HL_PRIM vdynamic *HL_NAME(gl_get_shader_parameter)( vdynamic *s, int param ) {
  219. switch( param ) {
  220. case 0x8B81/*COMPILE_STATUS*/:
  221. case 0x8B4F/*SHADER_TYPE*/:
  222. case 0x8B80/*DELETE_STATUS*/:
  223. {
  224. int ret = 0;
  225. glGetShaderiv(s->v.i, param, &ret);
  226. return alloc_i32(ret);
  227. }
  228. default:
  229. hl_error("Unsupported param %d", param);
  230. }
  231. return NULL;
  232. }
  233. HL_PRIM void HL_NAME(gl_delete_shader)( vdynamic *s ) {
  234. glDeleteShader(s->v.i);
  235. }
  236. // texture
  237. HL_PRIM vdynamic *HL_NAME(gl_create_texture)() {
  238. unsigned int t = 0;
  239. glGenTextures(1, &t);
  240. return alloc_i32(t);
  241. }
  242. HL_PRIM void HL_NAME(gl_active_texture)( int t ) {
  243. glActiveTexture(t);
  244. }
  245. HL_PRIM void HL_NAME(gl_bind_texture)( int t, vdynamic *texture ) {
  246. glBindTexture(t, ZIDX(texture));
  247. }
  248. HL_PRIM void HL_NAME(gl_bind_image_texture)( int unit, int texture, int level, bool layered, int layer, int access, int format ) {
  249. glBindImageTexture(unit, texture, level, layered, layer, access, format);
  250. }
  251. HL_PRIM void HL_NAME(gl_tex_parameterf)( int t, int key, float value ) {
  252. glTexParameterf(t, key, value);
  253. }
  254. HL_PRIM void HL_NAME(gl_tex_parameteri)( int t, int key, int value ) {
  255. glTexParameteri(t, key, value);
  256. }
  257. HL_PRIM void HL_NAME(gl_tex_image2d)( int target, int level, int internalFormat, int width, int height, int border, int format, int type, vbyte *image ) {
  258. glTexImage2D(target, level, internalFormat, width, height, border, format, type, image);
  259. }
  260. HL_PRIM void HL_NAME(gl_tex_image3d)( int target, int level, int internalFormat, int width, int height, int depth, int border, int format, int type, vbyte *image ) {
  261. glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, image);
  262. }
  263. HL_PRIM void HL_NAME(gl_tex_image2d_multisample)( int target, int samples, int internalFormat, int width, int height, bool fixedsamplelocations) {
  264. glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedsamplelocations);
  265. }
  266. HL_PRIM void HL_NAME(gl_compressed_tex_image2d)( int target, int level, int internalFormat, int width, int height, int border, int imageSize, vbyte *image ) {
  267. glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,image);
  268. }
  269. HL_PRIM void HL_NAME(gl_compressed_tex_image3d)( int target, int level, int internalFormat, int width, int height, int depth, int border, int imageSize, vbyte *image ) {
  270. glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,image);
  271. }
  272. HL_PRIM void HL_NAME(gl_tex_sub_image2d)(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, vbyte *image) {
  273. glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, image);
  274. }
  275. HL_PRIM void HL_NAME(gl_tex_sub_image3d)(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, vbyte *image) {
  276. glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, image);
  277. }
  278. HL_PRIM void HL_NAME(gl_compressed_tex_sub_image2d)(int target, int level, int xoffset, int yoffset, int width, int height, int format, int type, vbyte *image) {
  279. glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, image);
  280. }
  281. HL_PRIM void HL_NAME(gl_compressed_tex_sub_image3d)(int target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, int format, int type, vbyte *image) {
  282. glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, image);
  283. }
  284. HL_PRIM void HL_NAME(gl_generate_mipmap)( int t ) {
  285. glGenerateMipmap(t);
  286. }
  287. HL_PRIM void HL_NAME(gl_delete_texture)( vdynamic *t ) {
  288. unsigned int tt = t->v.i;
  289. glDeleteTextures(1, &tt);
  290. }
  291. // framebuffer
  292. HL_PRIM void HL_NAME(gl_blit_framebuffer)(int src_x0, int src_y0, int src_x1, int src_y1, int dst_x0, int dst_y0, int dst_x1, int dst_y1, int mask, int filter) {
  293. glBlitFramebuffer(src_x0, src_y0, src_x1, src_y1, dst_x0, dst_y0, dst_x1, dst_y1, mask, filter);
  294. }
  295. HL_PRIM vdynamic *HL_NAME(gl_create_framebuffer)() {
  296. unsigned int f = 0;
  297. glGenFramebuffers(1, &f);
  298. return alloc_i32(f);
  299. }
  300. HL_PRIM void HL_NAME(gl_bind_framebuffer)( int target, vdynamic *f ) {
  301. unsigned int id = ZIDX(f);
  302. #if defined(HL_IOS) || defined(HL_TVOS)
  303. if ( id==0 ) {
  304. SDL_SysWMinfo info;
  305. SDL_VERSION(&info.version);
  306. SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info);
  307. id = info.info.uikit.framebuffer;
  308. }
  309. #endif
  310. glBindFramebuffer(target, id);
  311. }
  312. HL_PRIM void HL_NAME(gl_framebuffer_texture)( int target, int attach, vdynamic *t, int level ) {
  313. glFramebufferTexture(target, attach, ZIDX(t), level);
  314. }
  315. HL_PRIM void HL_NAME(gl_framebuffer_texture2d)( int target, int attach, int texTarget, vdynamic *t, int level ) {
  316. glFramebufferTexture2D(target, attach, texTarget, ZIDX(t), level);
  317. }
  318. HL_PRIM void HL_NAME(gl_framebuffer_texture_layer)( int target, int attach, vdynamic *t, int level, int layer ) {
  319. glFramebufferTextureLayer(target, attach, ZIDX(t), level, layer);
  320. }
  321. HL_PRIM void HL_NAME(gl_delete_framebuffer)( vdynamic *f ) {
  322. unsigned int ff = (unsigned)f->v.i;
  323. glDeleteFramebuffers(1, &ff);
  324. }
  325. HL_PRIM void HL_NAME(gl_read_pixels)( int x, int y, int width, int height, int format, int type, vbyte *data ) {
  326. glReadPixels(x, y, width, height, format, type, data);
  327. }
  328. HL_PRIM void HL_NAME(gl_read_buffer)( int mode ) {
  329. glReadBuffer(mode);
  330. }
  331. HL_PRIM void HL_NAME(gl_draw_buffers)( int count, unsigned int *buffers) {
  332. glDrawBuffers(count, buffers);
  333. }
  334. // renderbuffer
  335. HL_PRIM vdynamic *HL_NAME(gl_create_renderbuffer)() {
  336. unsigned int buf = 0;
  337. glGenRenderbuffers(1, &buf);
  338. return alloc_i32(buf);
  339. }
  340. HL_PRIM void HL_NAME(gl_bind_renderbuffer)( int target, vdynamic *r ) {
  341. unsigned int id = ZIDX(r);
  342. #if defined(HL_IOS) || defined(HL_TVOS)
  343. if ( id==0 ) {
  344. SDL_SysWMinfo info;
  345. SDL_VERSION(&info.version);
  346. SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info);
  347. id = info.info.uikit.colorbuffer;
  348. }
  349. #endif
  350. glBindRenderbuffer(GL_RENDERBUFFER, id);
  351. }
  352. HL_PRIM void HL_NAME(gl_renderbuffer_storage)( int target, int format, int width, int height ) {
  353. glRenderbufferStorage(target, format, width, height);
  354. }
  355. HL_PRIM void HL_NAME(gl_renderbuffer_storage_multisample)( int target, int samples, int format, int width, int height ) {
  356. glRenderbufferStorageMultisample(target, samples, format, width, height);
  357. }
  358. HL_PRIM void HL_NAME(gl_framebuffer_renderbuffer)( int frameTarget, int attach, int renderTarget, vdynamic *b ) {
  359. glFramebufferRenderbuffer(frameTarget, attach, renderTarget, ZIDX(b));
  360. }
  361. HL_PRIM void HL_NAME(gl_delete_renderbuffer)( vdynamic *b ) {
  362. unsigned int bb = (unsigned)b->v.i;
  363. glDeleteRenderbuffers(1, &bb);
  364. }
  365. // buffer
  366. HL_PRIM vdynamic *HL_NAME(gl_create_buffer)() {
  367. unsigned int b = 0;
  368. glGenBuffers(1, &b);
  369. return alloc_i32(b);
  370. }
  371. HL_PRIM void HL_NAME(gl_bind_buffer)( int target, vdynamic *b ) {
  372. glBindBuffer(target, ZIDX(b));
  373. }
  374. HL_PRIM void HL_NAME(gl_bind_buffer_base)( int target, int index, vdynamic *b ) {
  375. glBindBufferBase(target, index, ZIDX(b));
  376. }
  377. HL_PRIM void HL_NAME(gl_buffer_data_size)( int target, int size, int param ) {
  378. glBufferData(target, size, NULL, param);
  379. }
  380. HL_PRIM void HL_NAME(gl_buffer_data)( int target, int size, vbyte *data, int param ) {
  381. glBufferData(target, size, data, param);
  382. }
  383. HL_PRIM void HL_NAME(gl_buffer_sub_data)( int target, int offset, vbyte *data, int srcOffset, int srcLength ) {
  384. glBufferSubData(target, offset, srcLength, data + srcOffset);
  385. }
  386. HL_PRIM void HL_NAME(gl_enable_vertex_attrib_array)( int attrib ) {
  387. glEnableVertexAttribArray(attrib);
  388. }
  389. HL_PRIM void HL_NAME(gl_disable_vertex_attrib_array)( int attrib ) {
  390. glDisableVertexAttribArray(attrib);
  391. }
  392. HL_PRIM void HL_NAME(gl_vertex_attrib_pointer)( int index, int size, int type, bool normalized, int stride, int position ) {
  393. glVertexAttribPointer(index, size, type, normalized, stride, (void*)(int_val)position);
  394. }
  395. HL_PRIM void HL_NAME(gl_vertex_attrib_ipointer)( int index, int size, int type, int stride, int position ) {
  396. glVertexAttribIPointer(index, size, type, stride, (void*)(int_val)position);
  397. }
  398. HL_PRIM void HL_NAME(gl_vertex_attrib_divisor)( int index, int divisor ) {
  399. glVertexAttribDivisor(index, divisor);
  400. }
  401. HL_PRIM void HL_NAME(gl_delete_buffer)( vdynamic *b ) {
  402. unsigned int bb = (unsigned)b->v.i;
  403. glDeleteBuffers(1, &bb);
  404. }
  405. // uniforms
  406. HL_PRIM void HL_NAME(gl_uniform1i)( vdynamic *u, int i ) {
  407. glUniform1i(u->v.i, i);
  408. }
  409. HL_PRIM void HL_NAME(gl_uniform4fv)( vdynamic *u, vbyte *buffer, int bufPos, int count ) {
  410. glUniform4fv(u->v.i, count, (float*)buffer + bufPos);
  411. }
  412. HL_PRIM void HL_NAME(gl_uniform_matrix4fv)( vdynamic *u, bool transpose, vbyte *buffer, int bufPos, int count ) {
  413. glUniformMatrix4fv(u->v.i, count, transpose ? GL_TRUE : GL_FALSE, (float*)buffer + bufPos);
  414. }
  415. // compute
  416. HL_PRIM void HL_NAME(gl_dispatch_compute)( int num_groups_x, int num_groups_y, int num_groups_z ) {
  417. glDispatchCompute(num_groups_x, num_groups_y, num_groups_z);
  418. }
  419. HL_PRIM void HL_NAME(gl_memory_barrier)( int barriers ) {
  420. glMemoryBarrier(barriers);
  421. }
  422. // draw
  423. HL_PRIM void HL_NAME(gl_draw_elements)( int mode, int count, int type, int start ) {
  424. glDrawElements(mode, count, type, (void*)(int_val)start);
  425. }
  426. HL_PRIM void HL_NAME(gl_draw_arrays)( int mode, int first, int count, int start ) {
  427. glDrawArrays(mode,first,count);
  428. }
  429. HL_PRIM void HL_NAME(gl_draw_elements_instanced)( int mode, int count, int type, int start, int primcount ) {
  430. glDrawElementsInstanced(mode,count,type,(void*)(int_val)start,primcount);
  431. }
  432. HL_PRIM void HL_NAME(gl_draw_arrays_instanced)( int mode, int first, int count, int primcount ) {
  433. glDrawArraysInstanced(mode,first,count,primcount);
  434. }
  435. HL_PRIM void HL_NAME(gl_multi_draw_elements_indirect)( int mode, int type, vbyte *data, int count, int stride ) {
  436. # ifdef GL_VERSION_4_3
  437. glMultiDrawElementsIndirect(mode, type, data, count, stride);
  438. # endif
  439. }
  440. HL_PRIM int HL_NAME(gl_get_config_parameter)( int feature ) {
  441. switch( feature ) {
  442. case 0:
  443. # ifdef GL_VERSION_4_3
  444. return 1;
  445. # else
  446. return 0;
  447. # endif
  448. default:
  449. break;
  450. }
  451. return -1;
  452. }
  453. // queries
  454. HL_PRIM vdynamic *HL_NAME(gl_create_query)() {
  455. unsigned int t = 0;
  456. glGenQueries(1, &t);
  457. return alloc_i32(t);
  458. }
  459. HL_PRIM void HL_NAME(gl_delete_query)( vdynamic *q ) {
  460. glDeleteQueries(1, (const GLuint *) &q->v.i);
  461. }
  462. HL_PRIM void HL_NAME(gl_begin_query)( int target, vdynamic *q ) {
  463. glBeginQuery(target,q->v.i);
  464. }
  465. HL_PRIM void HL_NAME(gl_end_query)( int target ) {
  466. glEndQuery(target);
  467. }
  468. HL_PRIM bool HL_NAME(gl_query_result_available)( vdynamic *q ) {
  469. int v = 0;
  470. glGetQueryObjectiv(q->v.i, GL_QUERY_RESULT_AVAILABLE, &v);
  471. return v == GL_TRUE;
  472. }
  473. HL_PRIM double HL_NAME(gl_query_result)( vdynamic *q ) {
  474. GLuint64 v = -1;
  475. # if !defined(HL_MESA) && !defined(HL_MOBILE)
  476. glGetQueryObjectui64v(q->v.i, GL_QUERY_RESULT, &v);
  477. # endif
  478. return (double)v;
  479. }
  480. HL_PRIM void HL_NAME(gl_query_counter)( vdynamic *q, int target ) {
  481. # if !defined(HL_MESA) && !defined(HL_MOBILE)
  482. glQueryCounter(q->v.i, target);
  483. # endif
  484. }
  485. // vertex array
  486. HL_PRIM vdynamic *HL_NAME(gl_create_vertex_array)() {
  487. unsigned int f = 0;
  488. glGenVertexArrays(1, &f);
  489. return alloc_i32(f);
  490. }
  491. HL_PRIM void HL_NAME(gl_bind_vertex_array)( vdynamic *b ) {
  492. unsigned int bb = (unsigned)b->v.i;
  493. glBindVertexArray(bb);
  494. }
  495. HL_PRIM void HL_NAME(gl_delete_vertex_array)( vdynamic *b ) {
  496. unsigned int bb = (unsigned)b->v.i;
  497. glDeleteVertexArrays(1, &bb);
  498. }
  499. // uniform buffer
  500. HL_PRIM int HL_NAME(gl_get_uniform_block_index)( vdynamic *p, vstring *name ) {
  501. char *cname = hl_to_utf8(name->bytes);
  502. return (int)glGetUniformBlockIndex(p->v.i, cname);
  503. }
  504. HL_PRIM void HL_NAME(gl_uniform_block_binding)( vdynamic *p, int index, int binding ) {
  505. glUniformBlockBinding(p->v.i, index, binding);
  506. }
  507. DEFINE_PRIM(_BOOL,gl_init,_NO_ARG);
  508. DEFINE_PRIM(_BOOL,gl_is_context_lost,_NO_ARG);
  509. DEFINE_PRIM(_VOID,gl_clear,_I32);
  510. DEFINE_PRIM(_I32,gl_get_error,_NO_ARG);
  511. DEFINE_PRIM(_VOID,gl_scissor,_I32 _I32 _I32 _I32);
  512. DEFINE_PRIM(_VOID,gl_clear_color,_F64 _F64 _F64 _F64);
  513. DEFINE_PRIM(_VOID,gl_clear_depth,_F64);
  514. DEFINE_PRIM(_VOID,gl_clear_stencil,_I32);
  515. DEFINE_PRIM(_VOID,gl_viewport,_I32 _I32 _I32 _I32);
  516. DEFINE_PRIM(_VOID,gl_finish,_NO_ARG);
  517. DEFINE_PRIM(_VOID,gl_flush,_NO_ARG);
  518. DEFINE_PRIM(_VOID,gl_pixel_storei,_I32 _I32);
  519. DEFINE_PRIM(_BYTES,gl_get_string,_I32);
  520. DEFINE_PRIM(_VOID,gl_polygon_mode,_I32 _I32);
  521. DEFINE_PRIM(_VOID,gl_enable,_I32);
  522. DEFINE_PRIM(_VOID,gl_disable,_I32);
  523. DEFINE_PRIM(_VOID,gl_cull_face,_I32);
  524. DEFINE_PRIM(_VOID,gl_blend_func,_I32 _I32);
  525. DEFINE_PRIM(_VOID,gl_blend_func_separate,_I32 _I32 _I32 _I32);
  526. DEFINE_PRIM(_VOID,gl_blend_equation,_I32);
  527. DEFINE_PRIM(_VOID,gl_blend_equation_separate,_I32 _I32);
  528. DEFINE_PRIM(_VOID,gl_depth_mask,_BOOL);
  529. DEFINE_PRIM(_VOID,gl_depth_func,_I32);
  530. DEFINE_PRIM(_VOID,gl_color_mask,_BOOL _BOOL _BOOL _BOOL);
  531. DEFINE_PRIM(_VOID,gl_stencil_mask_separate,_I32 _I32);
  532. DEFINE_PRIM(_VOID,gl_stencil_func_separate,_I32 _I32 _I32 _I32);
  533. DEFINE_PRIM(_VOID,gl_stencil_op_separate,_I32 _I32 _I32 _I32);
  534. DEFINE_PRIM(_NULL(_I32),gl_create_program,_NO_ARG);
  535. DEFINE_PRIM(_VOID,gl_delete_program,_NULL(_I32));
  536. DEFINE_PRIM(_VOID,gl_bind_frag_data_location,_NULL(_I32) _I32 _STRING);
  537. DEFINE_PRIM(_VOID,gl_attach_shader,_NULL(_I32) _NULL(_I32));
  538. DEFINE_PRIM(_VOID,gl_link_program,_NULL(_I32));
  539. DEFINE_PRIM(_DYN,gl_get_program_parameter,_NULL(_I32) _I32);
  540. DEFINE_PRIM(_BYTES,gl_get_program_info_bytes,_NULL(_I32));
  541. DEFINE_PRIM(_NULL(_I32),gl_get_uniform_location,_NULL(_I32) _STRING);
  542. DEFINE_PRIM(_I32,gl_get_attrib_location,_NULL(_I32) _STRING);
  543. DEFINE_PRIM(_VOID,gl_use_program,_NULL(_I32));
  544. DEFINE_PRIM(_NULL(_I32),gl_create_shader,_I32);
  545. DEFINE_PRIM(_VOID,gl_shader_source,_NULL(_I32) _STRING);
  546. DEFINE_PRIM(_VOID,gl_compile_shader,_NULL(_I32));
  547. DEFINE_PRIM(_BYTES,gl_get_shader_info_bytes,_NULL(_I32));
  548. DEFINE_PRIM(_DYN,gl_get_shader_parameter,_NULL(_I32) _I32);
  549. DEFINE_PRIM(_VOID,gl_delete_shader,_NULL(_I32));
  550. DEFINE_PRIM(_NULL(_I32),gl_create_texture,_NO_ARG);
  551. DEFINE_PRIM(_VOID,gl_active_texture,_I32);
  552. DEFINE_PRIM(_VOID,gl_bind_texture,_I32 _NULL(_I32));
  553. DEFINE_PRIM(_VOID,gl_tex_parameteri,_I32 _I32 _I32);
  554. DEFINE_PRIM(_VOID,gl_tex_parameterf,_I32 _I32 _F32);
  555. DEFINE_PRIM(_VOID,gl_tex_image2d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  556. DEFINE_PRIM(_VOID,gl_tex_image3d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  557. DEFINE_PRIM(_VOID,gl_tex_image2d_multisample,_I32 _I32 _I32 _I32 _I32 _BOOL);
  558. DEFINE_PRIM(_VOID,gl_compressed_tex_image2d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  559. DEFINE_PRIM(_VOID,gl_compressed_tex_image3d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  560. DEFINE_PRIM(_VOID,gl_tex_sub_image2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  561. DEFINE_PRIM(_VOID,gl_tex_sub_image3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  562. DEFINE_PRIM(_VOID,gl_compressed_tex_sub_image2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  563. DEFINE_PRIM(_VOID,gl_compressed_tex_sub_image3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  564. DEFINE_PRIM(_VOID,gl_generate_mipmap,_I32);
  565. DEFINE_PRIM(_VOID,gl_delete_texture,_NULL(_I32));
  566. DEFINE_PRIM(_VOID,gl_blit_framebuffer,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);
  567. DEFINE_PRIM(_NULL(_I32),gl_create_framebuffer,_NO_ARG);
  568. DEFINE_PRIM(_VOID,gl_bind_framebuffer,_I32 _NULL(_I32));
  569. DEFINE_PRIM(_VOID,gl_framebuffer_texture,_I32 _I32 _NULL(_I32) _I32);
  570. DEFINE_PRIM(_VOID,gl_framebuffer_texture2d,_I32 _I32 _I32 _NULL(_I32) _I32);
  571. DEFINE_PRIM(_VOID,gl_framebuffer_texture_layer,_I32 _I32 _NULL(_I32) _I32 _I32);
  572. DEFINE_PRIM(_VOID,gl_delete_framebuffer,_NULL(_I32));
  573. DEFINE_PRIM(_VOID,gl_read_pixels,_I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
  574. DEFINE_PRIM(_VOID,gl_read_buffer,_I32);
  575. DEFINE_PRIM(_VOID,gl_draw_buffers,_I32 _BYTES);
  576. DEFINE_PRIM(_NULL(_I32),gl_create_renderbuffer,_NO_ARG);
  577. DEFINE_PRIM(_VOID,gl_bind_renderbuffer,_I32 _NULL(_I32));
  578. DEFINE_PRIM(_VOID,gl_renderbuffer_storage,_I32 _I32 _I32 _I32);
  579. DEFINE_PRIM(_VOID,gl_renderbuffer_storage_multisample,_I32 _I32 _I32 _I32 _I32);
  580. DEFINE_PRIM(_VOID,gl_framebuffer_renderbuffer,_I32 _I32 _I32 _NULL(_I32));
  581. DEFINE_PRIM(_VOID,gl_delete_renderbuffer,_NULL(_I32));
  582. DEFINE_PRIM(_NULL(_I32),gl_create_buffer,_NO_ARG);
  583. DEFINE_PRIM(_VOID,gl_bind_buffer,_I32 _NULL(_I32));
  584. DEFINE_PRIM(_VOID,gl_bind_buffer_base,_I32 _I32 _NULL(_I32));
  585. DEFINE_PRIM(_VOID,gl_buffer_data_size,_I32 _I32 _I32);
  586. DEFINE_PRIM(_VOID,gl_buffer_data,_I32 _I32 _BYTES _I32);
  587. DEFINE_PRIM(_VOID,gl_buffer_sub_data,_I32 _I32 _BYTES _I32 _I32);
  588. DEFINE_PRIM(_VOID,gl_enable_vertex_attrib_array,_I32);
  589. DEFINE_PRIM(_VOID,gl_disable_vertex_attrib_array,_I32);
  590. DEFINE_PRIM(_VOID,gl_vertex_attrib_pointer,_I32 _I32 _I32 _BOOL _I32 _I32);
  591. DEFINE_PRIM(_VOID,gl_vertex_attrib_ipointer,_I32 _I32 _I32 _I32 _I32);
  592. DEFINE_PRIM(_VOID,gl_delete_buffer,_NULL(_I32));
  593. DEFINE_PRIM(_VOID,gl_uniform1i,_NULL(_I32) _I32);
  594. DEFINE_PRIM(_VOID,gl_uniform4fv,_NULL(_I32) _BYTES _I32 _I32);
  595. DEFINE_PRIM(_VOID,gl_uniform_matrix4fv,_NULL(_I32) _BOOL _BYTES _I32 _I32);
  596. DEFINE_PRIM(_VOID,gl_bind_image_texture,_I32 _I32 _I32 _BOOL _I32 _I32 _I32);
  597. DEFINE_PRIM(_VOID,gl_dispatch_compute,_I32 _I32 _I32);
  598. DEFINE_PRIM(_VOID,gl_memory_barrier,_I32);
  599. DEFINE_PRIM(_VOID,gl_draw_elements,_I32 _I32 _I32 _I32);
  600. DEFINE_PRIM(_VOID,gl_draw_elements_instanced,_I32 _I32 _I32 _I32 _I32);
  601. DEFINE_PRIM(_VOID,gl_draw_arrays,_I32 _I32 _I32);
  602. DEFINE_PRIM(_VOID,gl_draw_arrays_instanced,_I32 _I32 _I32 _I32);
  603. DEFINE_PRIM(_VOID,gl_multi_draw_elements_indirect, _I32 _I32 _BYTES _I32 _I32);
  604. DEFINE_PRIM(_NULL(_I32),gl_create_vertex_array,_NO_ARG);
  605. DEFINE_PRIM(_VOID,gl_bind_vertex_array,_NULL(_I32));
  606. DEFINE_PRIM(_VOID,gl_delete_vertex_array,_NULL(_I32));
  607. DEFINE_PRIM(_VOID,gl_vertex_attrib_divisor,_I32 _I32);
  608. DEFINE_PRIM(_NULL(_I32), gl_create_query, _NO_ARG);
  609. DEFINE_PRIM(_VOID, gl_delete_query, _NULL(_I32));
  610. DEFINE_PRIM(_VOID, gl_begin_query, _I32 _NULL(_I32));
  611. DEFINE_PRIM(_VOID, gl_end_query, _I32);
  612. DEFINE_PRIM(_BOOL, gl_query_result_available, _NULL(_I32));
  613. DEFINE_PRIM(_VOID, gl_query_counter, _NULL(_I32) _I32);
  614. DEFINE_PRIM(_F64, gl_query_result, _NULL(_I32));
  615. DEFINE_PRIM(_I32, gl_get_uniform_block_index, _NULL(_I32) _STRING);
  616. DEFINE_PRIM(_VOID, gl_uniform_block_binding, _NULL(_I32) _I32 _I32);
  617. DEFINE_PRIM(_I32, gl_get_config_parameter, _I32);