gl.c 29 KB

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