when defined(android) or defined(emscripten) or defined(ios): import glad/gles32_static as gl export gl else: import glad/gl as gl export gl proc get_shader_info_log*(shader: GLuint): string = var logSize: GLint glGetShaderiv(shader, GL_INFO_LOG_LENGTH, addr logSize) var s = newString(logSize) glGetShaderInfoLog(shader, logSize.GLsizei, nil, s.cstring) return s proc get_program_info_log*(program: GLuint): string = var logSize: GLint glGetProgramiv(program, GL_INFO_LOG_LENGTH, addr logSize) var s = newString(logSize) glGetProgramInfoLog(program, logSize.GLsizei, nil, s.cstring) return s when compileOption("threads"): let main_thread_id = getThreadID() template handleError(x: untyped, t: string) = when compileOption("threads"): assert main_thread_id == getThreadID() try: x except: echo "Error when deleting " & t echo getCurrentExceptionMsg() type GPUBuffer* = distinct GLuint type GPUTexture* = distinct GLuint type GPUVao* = distinct GLuint type GPUFramebuffer* = distinct GLuint type GPURenderbuffer* = distinct GLuint type GPUProgram* = distinct GLuint type GPUShader* = distinct GLuint proc `=destroy`(x: var GPUBuffer) = if x.GLuint != 0.GLuint: handleError glDeleteBuffers(1, x.GLuint.addr), "Buffer" proc `=destroy`(x: var GPUTexture) = if x.GLuint != 0.GLuint: handleError glDeleteTextures(1, x.GLuint.addr), "Texture" proc `=destroy`(x: var GPUVao) = if x.GLuint != 0.GLuint: handleError glDeleteVertexArrays(1, x.GLuint.addr), "VertexArray" proc `=destroy`(x: var GPUFramebuffer) = if x.GLuint != 0.GLuint: handleError glDeleteFramebuffers(1, x.GLuint.addr), "Framebuffer" proc `=destroy`(x: var GPURenderbuffer) = if x.GLuint != 0.GLuint: handleError glDeleteRenderbuffers(1, x.GLuint.addr), "Renderbuffer" proc `=destroy`(x: var GPUProgram) = if x.GLuint != 0.GLuint: handleError glDeleteProgram(x.GLuint), "Program" proc `=destroy`(x: var GPUShader) = if x.GLuint != 0.GLuint: handleError glDeleteShader(x.GLuint), "Shader"