| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865 |
- #define HL_NAME(n) sdl_##n
- #include <hl.h>
- #include "hlsystem.h"
- #if defined(HL_IOS) || defined (HL_TVOS)
- # include <SDL.h>
- # include <SDL_syswm.h>
- # include <OpenGLES/ES3/gl.h>
- # define HL_GLES
- #elif defined(HL_MAC)
- # include <SDL.h>
- # include <OpenGL/gl3.h>
- # define glBindImageTexture(...) hl_error("Not supported on OSX")
- # define glDispatchCompute(...) hl_error("Not supported on OSX")
- # define glMemoryBarrier(...) hl_error("Not supported on OSX")
- #elif defined(_WIN32)
- # include <SDL.h>
- # include <GL/gl.h>
- # include <GL/glext.h>
- #elif defined(HL_CONSOLE)
- # include <graphic/glapi.h>
- #elif defined(HL_MESA)
- # include <GLES3/gl3.h>
- # include <GL/osmesa.h>
- # define HL_GLES
- #elif defined(HL_ANDROID)
- # include <SDL.h>
- # include <GLES3/gl32.h>
- # include <GLES3/gl3ext.h>
- # define HL_GLES
- #else
- # include <SDL.h>
- # include <GL/glcorearb.h>
- #endif
- #ifdef HL_GLES
- # define GL_IMPORT(fun, t)
- # define ES_NOT_SUPPORTED hl_error("Not supported by GLES3")
- # define glBindFragDataLocation(...) ES_NOT_SUPPORTED
- # define glBindImageTexture(...) ES_NOT_SUPPORTED
- # define glTexImage2DMultisample(...) ES_NOT_SUPPORTED
- # define glFramebufferTexture(...) ES_NOT_SUPPORTED
- # define glDispatchCompute(...) ES_NOT_SUPPORTED
- # define glMemoryBarrier(...) ES_NOT_SUPPORTED
- # define glGetBufferSubData(...) ES_NOT_SUPPORTED
- # define glShaderStorageBlockBinding(...) ES_NOT_SUPPORTED
- # define glPolygonMode(face,mode) if( mode != 0x1B02 ) ES_NOT_SUPPORTED
- # define glGetQueryObjectiv glGetQueryObjectuiv
- # define glClearDepth glClearDepthf
- #endif
- #if !defined(HL_CONSOLE) && !defined(GL_IMPORT)
- #define GL_IMPORT(fun, t) PFNGL##t##PROC fun
- #include "GLImports.h"
- #undef GL_IMPORT
- #define GL_IMPORT(fun,t) fun = (PFNGL##t##PROC)SDL_GL_GetProcAddress(#fun); if( fun == NULL ) return 1
- #ifndef __APPLE__
- #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"); }
- #endif
- #endif
- #if !defined GL_IMPORT_OPT
- #define GL_IMPORT_OPT(fun, t)
- #define glMultiDrawElementsIndirectCountARB(...) hl_error("function not resolved");
- #endif
- static int GLLoadAPI() {
- # include "GLImports.h"
- return 0;
- }
- #ifdef GL_VERSION_4_3
- static void APIENTRY debug_message_callback( GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam ) {
- fprintf(stderr, "GL %s: type = 0x%x, severity = 0x%x, message = %s\n",
- ( type == GL_DEBUG_TYPE_ERROR ? "** ERROR **" : "DEBUG" ),
- type, severity, message);
- }
- #endif
- #define ZIDX(val) ((val)?(val)->v.i:0)
- // globals
- HL_PRIM bool HL_NAME(gl_init)() {
- return GLLoadAPI() == 0;
- }
- HL_PRIM bool HL_NAME(gl_set_debug)( bool enable ) {
- #ifdef GL_VERSION_4_3
- if( enable ) {
- glEnable(GL_DEBUG_OUTPUT);
- glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_PERFORMANCE, GL_DONT_CARE, 0, NULL, GL_FALSE);
- glDebugMessageControl(GL_DONT_CARE, GL_DEBUG_TYPE_OTHER, GL_DONT_CARE, 0, NULL, GL_FALSE);
- glDebugMessageCallback(debug_message_callback, 0);
- } else {
- glDisable(GL_DEBUG_OUTPUT);
- }
- return true;
- #else
- return false;
- #endif
- }
- HL_PRIM bool HL_NAME(gl_is_context_lost)() {
- // seems like a GL context is rarely lost on desktop
- // let's look at it again on mobile
- return false;
- }
- HL_PRIM void HL_NAME(gl_clear)( int bits ) {
- glClear(bits);
- }
- HL_PRIM int HL_NAME(gl_get_error)() {
- return glGetError();
- }
- HL_PRIM void HL_NAME(gl_scissor)( int x, int y, int width, int height ) {
- glScissor(x, y, width, height);
- }
- HL_PRIM void HL_NAME(gl_clear_color)( double r, double g, double b, double a ) {
- glClearColor((float)r, (float)g, (float)b, (float)a);
- }
- HL_PRIM void HL_NAME(gl_clear_depth)( double value ) {
- glClearDepth(value);
- }
- HL_PRIM void HL_NAME(gl_clear_stencil)( int value ) {
- glClearStencil(value);
- }
- HL_PRIM void HL_NAME(gl_viewport)( int x, int y, int width, int height ) {
- glViewport(x, y, width, height);
- }
- HL_PRIM void HL_NAME(gl_flush)() {
- glFlush();
- }
- HL_PRIM void HL_NAME(gl_finish)() {
- glFinish();
- }
- HL_PRIM void HL_NAME(gl_pixel_storei)( int key, int value ) {
- glPixelStorei(key, value);
- }
- HL_PRIM vbyte *HL_NAME(gl_get_string)(int name) {
- return (vbyte*)glGetString(name);
- }
- // state changes
- HL_PRIM void HL_NAME(gl_polygon_mode)(int face, int mode) {
- glPolygonMode(face, mode);
- }
- HL_PRIM void HL_NAME(gl_polygon_offset)(float factor, float units) {
- glPolygonOffset(factor, units);
- }
- HL_PRIM void HL_NAME(gl_enable)( int feature ) {
- glEnable(feature);
- }
- HL_PRIM void HL_NAME(gl_disable)( int feature ) {
- glDisable(feature);
- }
- HL_PRIM void HL_NAME(gl_cull_face)( int face ) {
- glCullFace(face);
- }
- HL_PRIM void HL_NAME(gl_blend_func)( int src, int dst ) {
- glBlendFunc(src, dst);
- }
- HL_PRIM void HL_NAME(gl_blend_func_separate)( int src, int dst, int alphaSrc, int alphaDst ) {
- glBlendFuncSeparate(src, dst, alphaSrc, alphaDst);
- }
- HL_PRIM void HL_NAME(gl_blend_equation)( int op ) {
- glBlendEquation(op);
- }
- HL_PRIM void HL_NAME(gl_blend_equation_separate)( int op, int alphaOp ) {
- glBlendEquationSeparate(op, alphaOp);
- }
- HL_PRIM void HL_NAME(gl_depth_mask)( bool mask ) {
- glDepthMask(mask);
- }
- HL_PRIM void HL_NAME(gl_depth_func)( int f ) {
- glDepthFunc(f);
- }
- HL_PRIM void HL_NAME(gl_color_mask)( bool r, bool g, bool b, bool a ) {
- glColorMask(r, g, b, a);
- }
- HL_PRIM void HL_NAME(gl_color_maski)( int i, bool r, bool g, bool b, bool a ) {
- glColorMaski(i, r, g, b, a);
- }
- HL_PRIM void HL_NAME(gl_stencil_mask_separate)(int face, int mask) {
- glStencilMaskSeparate(face, mask);
- }
- HL_PRIM void HL_NAME(gl_stencil_func_separate)(int face, int func, int ref, int mask ) {
- glStencilFuncSeparate(face, func, ref, mask);
- }
- HL_PRIM void HL_NAME(gl_stencil_op_separate)(int face, int sfail, int dpfail, int dppass) {
- glStencilOpSeparate(face, sfail, dpfail, dppass);
- }
- // program
- static vdynamic *alloc_i32(int v) {
- vdynamic *ret;
- ret = hl_alloc_dynamic(&hlt_i32);
- ret->v.i = v;
- return ret;
- }
- HL_PRIM vdynamic *HL_NAME(gl_create_program)() {
- int v = glCreateProgram();
- if( v == 0 ) return NULL;
- return alloc_i32(v);
- }
- HL_PRIM void HL_NAME(gl_delete_program)( vdynamic *s ) {
- glDeleteProgram(s->v.i);
- }
- HL_PRIM void HL_NAME(gl_bind_frag_data_location)( vdynamic *p, int colNum, vstring *name ) {
- char *cname = hl_to_utf8(name->bytes);
- glBindFragDataLocation(p->v.i, colNum, cname);
- }
- HL_PRIM void HL_NAME(gl_attach_shader)( vdynamic *p, vdynamic *s ) {
- glAttachShader(p->v.i, s->v.i);
- }
- HL_PRIM void HL_NAME(gl_link_program)( vdynamic *p ) {
- glLinkProgram(p->v.i);
- }
- HL_PRIM vdynamic *HL_NAME(gl_get_program_parameter)( vdynamic *p, int param ) {
- switch( param ) {
- case 0x8B82 /*LINK_STATUS*/ : {
- int ret = 0;
- glGetProgramiv(p->v.i, param, &ret);
- return alloc_i32(ret);
- }
- default:
- hl_error("Unsupported param %d",param);
- }
- return NULL;
- }
- HL_PRIM vbyte *HL_NAME(gl_get_program_info_bytes)( vdynamic *p ) {
- char log[4096];
- *log = 0;
- glGetProgramInfoLog(p->v.i, 4096, NULL, log);
- return hl_copy_bytes((vbyte*)log,(int)strlen(log) + 1);
- }
- HL_PRIM vdynamic *HL_NAME(gl_get_uniform_location)( vdynamic *p, vstring *name ) {
- char *cname = hl_to_utf8(name->bytes);
- int u = glGetUniformLocation(p->v.i, cname);
- if( u < 0 ) return NULL;
- return alloc_i32(u);
- }
- HL_PRIM int HL_NAME(gl_get_attrib_location)( vdynamic *p, vstring *name ) {
- char *cname = hl_to_utf8(name->bytes);
- return glGetAttribLocation(p->v.i, cname);
- }
- HL_PRIM void HL_NAME(gl_use_program)( vdynamic *p ) {
- glUseProgram(ZIDX(p));
- }
- // shader
- HL_PRIM vdynamic *HL_NAME(gl_create_shader)( int type ) {
- int s = glCreateShader(type);
- if (s == 0) return NULL;
- return alloc_i32(s);
- }
- HL_PRIM void HL_NAME(gl_shader_source)( vdynamic *s, vstring *src ) {
- const GLchar *c = (GLchar*)hl_to_utf8(src->bytes);
- glShaderSource(s->v.i, 1, &c, NULL);
- }
- HL_PRIM void HL_NAME(gl_compile_shader)( vdynamic *s ) {
- glCompileShader(s->v.i);
- }
- HL_PRIM vbyte *HL_NAME(gl_get_shader_info_bytes)( vdynamic *s ) {
- char log[4096];
- *log = 0;
- glGetShaderInfoLog(s->v.i, 4096, NULL, log);
- return hl_copy_bytes((vbyte*)log, (int)strlen(log)+1);
- }
- HL_PRIM vdynamic *HL_NAME(gl_get_shader_parameter)( vdynamic *s, int param ) {
- switch( param ) {
- case 0x8B81/*COMPILE_STATUS*/:
- case 0x8B4F/*SHADER_TYPE*/:
- case 0x8B80/*DELETE_STATUS*/:
- {
- int ret = 0;
- glGetShaderiv(s->v.i, param, &ret);
- return alloc_i32(ret);
- }
- default:
- hl_error("Unsupported param %d", param);
- }
- return NULL;
- }
- HL_PRIM void HL_NAME(gl_delete_shader)( vdynamic *s ) {
- glDeleteShader(s->v.i);
- }
- // texture
- HL_PRIM vdynamic *HL_NAME(gl_create_texture)() {
- unsigned int t = 0;
- glGenTextures(1, &t);
- return alloc_i32(t);
- }
- HL_PRIM void HL_NAME(gl_active_texture)( int t ) {
- glActiveTexture(t);
- }
- HL_PRIM void HL_NAME(gl_bind_texture)( int t, vdynamic *texture ) {
- glBindTexture(t, ZIDX(texture));
- }
- HL_PRIM void HL_NAME(gl_bind_image_texture)( int unit, int texture, int level, bool layered, int layer, int access, int format ) {
- glBindImageTexture(unit, texture, level, layered, layer, access, format);
- }
- HL_PRIM void HL_NAME(gl_tex_parameterf)( int t, int key, float value ) {
- glTexParameterf(t, key, value);
- }
- HL_PRIM void HL_NAME(gl_tex_parameteri)( int t, int key, int value ) {
- glTexParameteri(t, key, value);
- }
- 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 ) {
- glTexImage2D(target, level, internalFormat, width, height, border, format, type, image);
- }
- 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 ) {
- glTexImage3D(target, level, internalFormat, width, height, depth, border, format, type, image);
- }
- HL_PRIM void HL_NAME(gl_tex_storage2d)( int target, int levels, int internalFormat, int width, int height) {
- #ifndef __APPLE__
- glTexStorage2D(target, levels, internalFormat, width, height);
- #else
- hl_error("glTexStorage2d is not supported on Apple platforms");
- #endif
- }
- HL_PRIM void HL_NAME(gl_tex_storage3d)( int target, int levels, int internalFormat, int width, int height, int depth) {
- #ifndef __APPLE__
- glTexStorage3D(target, levels, internalFormat, width, height, depth);
- #else
- hl_error("glTexStorage3d is not supported on Apple platforms");
- #endif
- }
- HL_PRIM void HL_NAME(gl_tex_image2d_multisample)( int target, int samples, int internalFormat, int width, int height, bool fixedsamplelocations) {
- glTexImage2DMultisample(target, samples, internalFormat, width, height, fixedsamplelocations);
- }
- 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 ) {
- glCompressedTexImage2D(target,level,internalFormat,width,height,border,imageSize,image);
- }
- 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 ) {
- glCompressedTexImage3D(target,level,internalFormat,width,height,depth,border,imageSize,image);
- }
- 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) {
- glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, image);
- }
- 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) {
- glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, image);
- }
- 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) {
- glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, image);
- }
- 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) {
- glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, image);
- }
- HL_PRIM void HL_NAME(gl_generate_mipmap)( int t ) {
- glGenerateMipmap(t);
- }
- HL_PRIM void HL_NAME(gl_delete_texture)( vdynamic *t ) {
- unsigned int tt = t->v.i;
- glDeleteTextures(1, &tt);
- }
- // framebuffer
- 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) {
- glBlitFramebuffer(src_x0, src_y0, src_x1, src_y1, dst_x0, dst_y0, dst_x1, dst_y1, mask, filter);
- }
- HL_PRIM vdynamic *HL_NAME(gl_create_framebuffer)() {
- unsigned int f = 0;
- glGenFramebuffers(1, &f);
- return alloc_i32(f);
- }
- HL_PRIM void HL_NAME(gl_bind_framebuffer)( int target, vdynamic *f ) {
- unsigned int id = ZIDX(f);
- #if defined(HL_IOS) || defined(HL_TVOS)
- if ( id==0 ) {
- SDL_SysWMinfo info;
- SDL_VERSION(&info.version);
- SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info);
- id = info.info.uikit.framebuffer;
- }
- #endif
- glBindFramebuffer(target, id);
- }
- HL_PRIM void HL_NAME(gl_framebuffer_texture)( int target, int attach, vdynamic *t, int level ) {
- glFramebufferTexture(target, attach, ZIDX(t), level);
- }
- HL_PRIM void HL_NAME(gl_framebuffer_texture2d)( int target, int attach, int texTarget, vdynamic *t, int level ) {
- glFramebufferTexture2D(target, attach, texTarget, ZIDX(t), level);
- }
- HL_PRIM void HL_NAME(gl_framebuffer_texture_layer)( int target, int attach, vdynamic *t, int level, int layer ) {
- glFramebufferTextureLayer(target, attach, ZIDX(t), level, layer);
- }
- HL_PRIM void HL_NAME(gl_delete_framebuffer)( vdynamic *f ) {
- unsigned int ff = (unsigned)f->v.i;
- glDeleteFramebuffers(1, &ff);
- }
- HL_PRIM void HL_NAME(gl_read_pixels)( int x, int y, int width, int height, int format, int type, vbyte *data ) {
- glReadPixels(x, y, width, height, format, type, data);
- }
- HL_PRIM void HL_NAME(gl_read_buffer)( int mode ) {
- glReadBuffer(mode);
- }
- HL_PRIM void HL_NAME(gl_draw_buffers)( int count, unsigned int *buffers) {
- glDrawBuffers(count, buffers);
- }
- // renderbuffer
- HL_PRIM vdynamic *HL_NAME(gl_create_renderbuffer)() {
- unsigned int buf = 0;
- glGenRenderbuffers(1, &buf);
- return alloc_i32(buf);
- }
- HL_PRIM void HL_NAME(gl_bind_renderbuffer)( int target, vdynamic *r ) {
- unsigned int id = ZIDX(r);
- #if defined(HL_IOS) || defined(HL_TVOS)
- if ( id==0 ) {
- SDL_SysWMinfo info;
- SDL_VERSION(&info.version);
- SDL_GetWindowWMInfo(SDL_GL_GetCurrentWindow(), &info);
- id = info.info.uikit.colorbuffer;
- }
- #endif
- glBindRenderbuffer(GL_RENDERBUFFER, id);
- }
- HL_PRIM void HL_NAME(gl_renderbuffer_storage)( int target, int format, int width, int height ) {
- glRenderbufferStorage(target, format, width, height);
- }
- HL_PRIM void HL_NAME(gl_renderbuffer_storage_multisample)( int target, int samples, int format, int width, int height ) {
- glRenderbufferStorageMultisample(target, samples, format, width, height);
- }
- HL_PRIM void HL_NAME(gl_framebuffer_renderbuffer)( int frameTarget, int attach, int renderTarget, vdynamic *b ) {
- glFramebufferRenderbuffer(frameTarget, attach, renderTarget, ZIDX(b));
- }
- HL_PRIM void HL_NAME(gl_delete_renderbuffer)( vdynamic *b ) {
- unsigned int bb = (unsigned)b->v.i;
- glDeleteRenderbuffers(1, &bb);
- }
- // buffer
- HL_PRIM vdynamic *HL_NAME(gl_create_buffer)() {
- unsigned int b = 0;
- glGenBuffers(1, &b);
- return alloc_i32(b);
- }
- HL_PRIM void HL_NAME(gl_bind_buffer)( int target, vdynamic *b ) {
- glBindBuffer(target, ZIDX(b));
- }
- HL_PRIM void HL_NAME(gl_bind_buffer_base)( int target, int index, vdynamic *b ) {
- glBindBufferBase(target, index, ZIDX(b));
- }
- HL_PRIM void HL_NAME(gl_buffer_data_size)( int target, int size, int param ) {
- glBufferData(target, size, NULL, param);
- }
- HL_PRIM void HL_NAME(gl_buffer_data)( int target, int size, vbyte *data, int param ) {
- glBufferData(target, size, data, param);
- }
- HL_PRIM void HL_NAME(gl_buffer_sub_data)( int target, int offset, vbyte *data, int srcOffset, int srcLength ) {
- glBufferSubData(target, offset, srcLength, data + srcOffset);
- }
- HL_PRIM void HL_NAME(gl_get_buffer_sub_data)( int target, int offset, vbyte *data, int srcOffset, int srcLength ) {
- glGetBufferSubData(target, srcOffset, srcLength, data + offset);
- }
- HL_PRIM void HL_NAME(gl_enable_vertex_attrib_array)( int attrib ) {
- glEnableVertexAttribArray(attrib);
- }
- HL_PRIM void HL_NAME(gl_disable_vertex_attrib_array)( int attrib ) {
- glDisableVertexAttribArray(attrib);
- }
- HL_PRIM void HL_NAME(gl_vertex_attrib_pointer)( int index, int size, int type, bool normalized, int stride, int position ) {
- glVertexAttribPointer(index, size, type, normalized, stride, (void*)(int_val)position);
- }
- HL_PRIM void HL_NAME(gl_vertex_attrib_ipointer)( int index, int size, int type, int stride, int position ) {
- glVertexAttribIPointer(index, size, type, stride, (void*)(int_val)position);
- }
- HL_PRIM void HL_NAME(gl_vertex_attrib_divisor)( int index, int divisor ) {
- glVertexAttribDivisor(index, divisor);
- }
- HL_PRIM void HL_NAME(gl_delete_buffer)( vdynamic *b ) {
- unsigned int bb = (unsigned)b->v.i;
- glDeleteBuffers(1, &bb);
- }
- // uniforms
- HL_PRIM void HL_NAME(gl_uniform1i)( vdynamic *u, int i ) {
- glUniform1i(u->v.i, i);
- }
- HL_PRIM void HL_NAME(gl_uniform4fv)( vdynamic *u, vbyte *buffer, int bufPos, int count ) {
- glUniform4fv(u->v.i, count, (float*)buffer + bufPos);
- }
- HL_PRIM void HL_NAME(gl_uniform_matrix4fv)( vdynamic *u, bool transpose, vbyte *buffer, int bufPos, int count ) {
- glUniformMatrix4fv(u->v.i, count, transpose ? GL_TRUE : GL_FALSE, (float*)buffer + bufPos);
- }
- // compute
- HL_PRIM void HL_NAME(gl_dispatch_compute)( int num_groups_x, int num_groups_y, int num_groups_z ) {
- glDispatchCompute(num_groups_x, num_groups_y, num_groups_z);
- }
- HL_PRIM void HL_NAME(gl_memory_barrier)( int barriers ) {
- glMemoryBarrier(barriers);
- }
- // draw
- HL_PRIM void HL_NAME(gl_draw_elements)( int mode, int count, int type, int start ) {
- glDrawElements(mode, count, type, (void*)(int_val)start);
- }
- HL_PRIM void HL_NAME(gl_draw_arrays)( int mode, int first, int count, int start ) {
- glDrawArrays(mode,first,count);
- }
- HL_PRIM void HL_NAME(gl_draw_elements_instanced)( int mode, int count, int type, int start, int primcount ) {
- glDrawElementsInstanced(mode,count,type,(void*)(int_val)start,primcount);
- }
- HL_PRIM void HL_NAME(gl_draw_arrays_instanced)( int mode, int first, int count, int primcount ) {
- glDrawArraysInstanced(mode,first,count,primcount);
- }
- HL_PRIM void HL_NAME(gl_multi_draw_elements_indirect)( int mode, int type, vbyte *data, int count, int stride ) {
- # ifdef GL_VERSION_4_3
- glMultiDrawElementsIndirect(mode, type, data, count, stride);
- # endif
- }
- HL_PRIM void HL_NAME(gl_multi_draw_elements_indirect_count)(int mode, int type, vbyte* data, vbyte* drawcount, int maxdrawcount, int stride) {
- GL_IMPORT_OPT(glMultiDrawElementsIndirectCountARB, MULTIDRAWELEMENTSINDIRECTCOUNTARB)
- glMultiDrawElementsIndirectCountARB(mode, type, data, (GLintptr)drawcount, maxdrawcount, stride);
- }
- HL_PRIM int HL_NAME(gl_get_config_parameter)( int feature ) {
- switch( feature ) {
- case 0:
- # ifdef GL_VERSION_4_3
- return 1;
- # else
- return 0;
- # endif
- default:
- {
- int r = -1;
- glGetIntegerv(feature, &r);
- return r;
- }
- break;
- }
- return -1;
- }
- HL_PRIM bool HL_NAME(gl_has_extension)(vstring *name) {
- const char* cname = hl_to_utf8(name->bytes);
- GLint numExtensions = 0;
- glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
- for (int i = 0; i < numExtensions; i++) {
- const char* ext = (const char*)glGetStringi(GL_EXTENSIONS, i);
- if (ext && strcmp(cname, ext) == 0) {
- return true;
- }
- }
- return false;
- }
- // queries
- HL_PRIM vdynamic *HL_NAME(gl_create_query)() {
- unsigned int t = 0;
- glGenQueries(1, &t);
- return alloc_i32(t);
- }
- HL_PRIM void HL_NAME(gl_delete_query)( vdynamic *q ) {
- glDeleteQueries(1, (const GLuint *) &q->v.i);
- }
- HL_PRIM void HL_NAME(gl_begin_query)( int target, vdynamic *q ) {
- glBeginQuery(target,q->v.i);
- }
- HL_PRIM void HL_NAME(gl_end_query)( int target ) {
- glEndQuery(target);
- }
- HL_PRIM bool HL_NAME(gl_query_result_available)( vdynamic *q ) {
- int v = 0;
- glGetQueryObjectiv(q->v.i, GL_QUERY_RESULT_AVAILABLE, &v);
- return v == GL_TRUE;
- }
- HL_PRIM double HL_NAME(gl_query_result)( vdynamic *q ) {
- GLuint64 v = -1;
- # if !defined(HL_MESA) && !defined(HL_MOBILE)
- glGetQueryObjectui64v(q->v.i, GL_QUERY_RESULT, &v);
- # endif
- return (double)v;
- }
- HL_PRIM void HL_NAME(gl_query_counter)( vdynamic *q, int target ) {
- # if !defined(HL_MESA) && !defined(HL_MOBILE)
- glQueryCounter(q->v.i, target);
- # endif
- }
- // vertex array
- HL_PRIM vdynamic *HL_NAME(gl_create_vertex_array)() {
- unsigned int f = 0;
- glGenVertexArrays(1, &f);
- return alloc_i32(f);
- }
- HL_PRIM void HL_NAME(gl_bind_vertex_array)( vdynamic *b ) {
- unsigned int bb = (unsigned)b->v.i;
- glBindVertexArray(bb);
- }
- HL_PRIM void HL_NAME(gl_delete_vertex_array)( vdynamic *b ) {
- unsigned int bb = (unsigned)b->v.i;
- glDeleteVertexArrays(1, &bb);
- }
- // uniform buffer
- HL_PRIM int HL_NAME(gl_get_uniform_block_index)( vdynamic *p, vstring *name ) {
- char *cname = hl_to_utf8(name->bytes);
- return (int)glGetUniformBlockIndex(p->v.i, cname);
- }
- HL_PRIM void HL_NAME(gl_uniform_block_binding)( vdynamic *p, int index, int binding ) {
- glUniformBlockBinding(p->v.i, index, binding);
- }
- // SSBOs
- HL_PRIM int HL_NAME(gl_get_program_resource_index)( vdynamic *p, int type, vstring *name ) {
- #ifndef __APPLE__
- char *cname = hl_to_utf8(name->bytes);
- return (int)glGetProgramResourceIndex(p->v.i, type, cname);
- #else
- hl_error("glGetProgramResourceIndex is not supported on Apple platforms");
- #endif
- }
- HL_PRIM void HL_NAME(gl_shader_storage_block_binding)( vdynamic *p, int index, int binding ) {
- #ifndef __APPLE__
- glShaderStorageBlockBinding(p->v.i, index, binding);
- #else
- hl_error("glShaderStorageBlockBinding is not supported on Apple platforms");
- #endif
- }
- DEFINE_PRIM(_BOOL,gl_init,_NO_ARG);
- DEFINE_PRIM(_BOOL,gl_set_debug,_BOOL);
- DEFINE_PRIM(_BOOL,gl_is_context_lost,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_clear,_I32);
- DEFINE_PRIM(_I32,gl_get_error,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_scissor,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_clear_color,_F64 _F64 _F64 _F64);
- DEFINE_PRIM(_VOID,gl_clear_depth,_F64);
- DEFINE_PRIM(_VOID,gl_clear_stencil,_I32);
- DEFINE_PRIM(_VOID,gl_viewport,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_finish,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_flush,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_pixel_storei,_I32 _I32);
- DEFINE_PRIM(_BYTES,gl_get_string,_I32);
- DEFINE_PRIM(_VOID,gl_polygon_mode,_I32 _I32);
- DEFINE_PRIM(_VOID,gl_polygon_offset,_F32 _F32);
- DEFINE_PRIM(_VOID,gl_enable,_I32);
- DEFINE_PRIM(_VOID,gl_disable,_I32);
- DEFINE_PRIM(_VOID,gl_cull_face,_I32);
- DEFINE_PRIM(_VOID,gl_blend_func,_I32 _I32);
- DEFINE_PRIM(_VOID,gl_blend_func_separate,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_blend_equation,_I32);
- DEFINE_PRIM(_VOID,gl_blend_equation_separate,_I32 _I32);
- DEFINE_PRIM(_VOID,gl_depth_mask,_BOOL);
- DEFINE_PRIM(_VOID,gl_depth_func,_I32);
- DEFINE_PRIM(_VOID,gl_color_mask,_BOOL _BOOL _BOOL _BOOL);
- DEFINE_PRIM(_VOID,gl_color_maski,_I32 _BOOL _BOOL _BOOL _BOOL);
- DEFINE_PRIM(_VOID,gl_stencil_mask_separate,_I32 _I32);
- DEFINE_PRIM(_VOID,gl_stencil_func_separate,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_stencil_op_separate,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_NULL(_I32),gl_create_program,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_delete_program,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_bind_frag_data_location,_NULL(_I32) _I32 _STRING);
- DEFINE_PRIM(_VOID,gl_attach_shader,_NULL(_I32) _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_link_program,_NULL(_I32));
- DEFINE_PRIM(_DYN,gl_get_program_parameter,_NULL(_I32) _I32);
- DEFINE_PRIM(_BYTES,gl_get_program_info_bytes,_NULL(_I32));
- DEFINE_PRIM(_NULL(_I32),gl_get_uniform_location,_NULL(_I32) _STRING);
- DEFINE_PRIM(_I32,gl_get_attrib_location,_NULL(_I32) _STRING);
- DEFINE_PRIM(_VOID,gl_use_program,_NULL(_I32));
- DEFINE_PRIM(_NULL(_I32),gl_create_shader,_I32);
- DEFINE_PRIM(_VOID,gl_shader_source,_NULL(_I32) _STRING);
- DEFINE_PRIM(_VOID,gl_compile_shader,_NULL(_I32));
- DEFINE_PRIM(_BYTES,gl_get_shader_info_bytes,_NULL(_I32));
- DEFINE_PRIM(_DYN,gl_get_shader_parameter,_NULL(_I32) _I32);
- DEFINE_PRIM(_VOID,gl_delete_shader,_NULL(_I32));
- DEFINE_PRIM(_NULL(_I32),gl_create_texture,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_active_texture,_I32);
- DEFINE_PRIM(_VOID,gl_bind_texture,_I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_tex_parameteri,_I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_tex_parameterf,_I32 _I32 _F32);
- DEFINE_PRIM(_VOID,gl_tex_image2d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_tex_image3d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_tex_storage2d,_I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_tex_storage3d,_I32 _I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_tex_image2d_multisample,_I32 _I32 _I32 _I32 _I32 _BOOL);
- DEFINE_PRIM(_VOID,gl_compressed_tex_image2d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_compressed_tex_image3d,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_tex_sub_image2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_tex_sub_image3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_compressed_tex_sub_image2d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_compressed_tex_sub_image3d, _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_generate_mipmap,_I32);
- DEFINE_PRIM(_VOID,gl_delete_texture,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_blit_framebuffer,_I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_NULL(_I32),gl_create_framebuffer,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_bind_framebuffer,_I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_framebuffer_texture,_I32 _I32 _NULL(_I32) _I32);
- DEFINE_PRIM(_VOID,gl_framebuffer_texture2d,_I32 _I32 _I32 _NULL(_I32) _I32);
- DEFINE_PRIM(_VOID,gl_framebuffer_texture_layer,_I32 _I32 _NULL(_I32) _I32 _I32);
- DEFINE_PRIM(_VOID,gl_delete_framebuffer,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_read_pixels,_I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
- DEFINE_PRIM(_VOID,gl_read_buffer,_I32);
- DEFINE_PRIM(_VOID,gl_draw_buffers,_I32 _BYTES);
- DEFINE_PRIM(_NULL(_I32),gl_create_renderbuffer,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_bind_renderbuffer,_I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_renderbuffer_storage,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_renderbuffer_storage_multisample,_I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_framebuffer_renderbuffer,_I32 _I32 _I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_delete_renderbuffer,_NULL(_I32));
- DEFINE_PRIM(_NULL(_I32),gl_create_buffer,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_bind_buffer,_I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_bind_buffer_base,_I32 _I32 _NULL(_I32));
- DEFINE_PRIM(_VOID,gl_buffer_data_size,_I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_buffer_data,_I32 _I32 _BYTES _I32);
- DEFINE_PRIM(_VOID,gl_buffer_sub_data,_I32 _I32 _BYTES _I32 _I32);
- DEFINE_PRIM(_VOID,gl_get_buffer_sub_data,_I32 _I32 _BYTES _I32 _I32);
- DEFINE_PRIM(_VOID,gl_enable_vertex_attrib_array,_I32);
- DEFINE_PRIM(_VOID,gl_disable_vertex_attrib_array,_I32);
- DEFINE_PRIM(_VOID,gl_vertex_attrib_pointer,_I32 _I32 _I32 _BOOL _I32 _I32);
- DEFINE_PRIM(_VOID,gl_vertex_attrib_ipointer,_I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_delete_buffer,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_uniform1i,_NULL(_I32) _I32);
- DEFINE_PRIM(_VOID,gl_uniform4fv,_NULL(_I32) _BYTES _I32 _I32);
- DEFINE_PRIM(_VOID,gl_uniform_matrix4fv,_NULL(_I32) _BOOL _BYTES _I32 _I32);
- DEFINE_PRIM(_VOID,gl_bind_image_texture,_I32 _I32 _I32 _BOOL _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_dispatch_compute,_I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_memory_barrier,_I32);
- DEFINE_PRIM(_VOID,gl_draw_elements,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_draw_elements_instanced,_I32 _I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_draw_arrays,_I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_draw_arrays_instanced,_I32 _I32 _I32 _I32);
- DEFINE_PRIM(_VOID,gl_multi_draw_elements_indirect, _I32 _I32 _BYTES _I32 _I32);
- DEFINE_PRIM(_VOID,gl_multi_draw_elements_indirect_count, _I32 _I32 _BYTES _BYTES _I32 _I32);
- DEFINE_PRIM(_NULL(_I32),gl_create_vertex_array,_NO_ARG);
- DEFINE_PRIM(_VOID,gl_bind_vertex_array,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_delete_vertex_array,_NULL(_I32));
- DEFINE_PRIM(_VOID,gl_vertex_attrib_divisor,_I32 _I32);
- DEFINE_PRIM(_NULL(_I32), gl_create_query, _NO_ARG);
- DEFINE_PRIM(_VOID, gl_delete_query, _NULL(_I32));
- DEFINE_PRIM(_VOID, gl_begin_query, _I32 _NULL(_I32));
- DEFINE_PRIM(_VOID, gl_end_query, _I32);
- DEFINE_PRIM(_BOOL, gl_query_result_available, _NULL(_I32));
- DEFINE_PRIM(_VOID, gl_query_counter, _NULL(_I32) _I32);
- DEFINE_PRIM(_F64, gl_query_result, _NULL(_I32));
- DEFINE_PRIM(_I32, gl_get_uniform_block_index, _NULL(_I32) _STRING);
- DEFINE_PRIM(_VOID, gl_uniform_block_binding, _NULL(_I32) _I32 _I32);
- DEFINE_PRIM(_I32, gl_get_program_resource_index, _NULL(_I32) _I32 _STRING);
- DEFINE_PRIM(_VOID, gl_shader_storage_block_binding, _NULL(_I32) _I32 _I32);
- DEFINE_PRIM(_I32, gl_get_config_parameter, _I32);
- DEFINE_PRIM(_BOOL, gl_has_extension, _STRING);
|