From 3a5a2cff6bb4e43c846c07323341bfcdd4644e4a Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Mon, 24 Feb 2020 13:22:55 +0100 Subject: [PATCH] app/internal/glimpl: add gl functions for uniform buffers Signed-off-by: Elias Naur --- app/internal/glimpl/gl.go | 35 +++++++++++++++++++++++++++++++ app/internal/glimpl/gl_js.go | 9 ++++++++ app/internal/glimpl/gl_windows.go | 18 +++++++++++++++- 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/app/internal/glimpl/gl.go b/app/internal/glimpl/gl.go index 3100bb95..17bac1f7 100644 --- a/app/internal/glimpl/gl.go +++ b/app/internal/glimpl/gl.go @@ -41,6 +41,9 @@ import ( #include #endif +static void (*_glBindBufferBase)(GLenum target, GLuint index, GLuint buffer); +static GLuint (*_glGetUniformBlockIndex)(GLuint program, const GLchar *uniformBlockName); +static void (*_glUniformBlockBinding)(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding); static void (*_glInvalidateFramebuffer)(GLenum target, GLsizei numAttachments, const GLenum *attachments); static void (*_glBeginQuery)(GLenum target, GLuint id); @@ -60,6 +63,18 @@ __attribute__ ((visibility ("hidden"))) void gio_glDrawElements(GLenum mode, GLs glDrawElements(mode, count, type, (const GLvoid *)offset); } +__attribute__ ((visibility ("hidden"))) void gio_glBindBufferBase(GLenum target, GLuint index, GLuint buffer) { + _glBindBufferBase(target, index, buffer); +} + +__attribute__ ((visibility ("hidden"))) void gio_glUniformBlockBinding(GLuint program, GLuint uniformBlockIndex, GLuint uniformBlockBinding) { + _glUniformBlockBinding(program, uniformBlockIndex, uniformBlockBinding); +} + +__attribute__ ((visibility ("hidden"))) GLuint gio_glGetUniformBlockIndex(GLuint program, const GLchar *uniformBlockName) { + return _glGetUniformBlockIndex(program, uniformBlockName); +} + __attribute__ ((visibility ("hidden"))) void gio_glInvalidateFramebuffer(GLenum target, GLenum attachment) { // gl.Framebuffer invalidation is just a hint and can safely be ignored. if (_glInvalidateFramebuffer != NULL) { @@ -104,10 +119,16 @@ __attribute__((constructor)) static void gio_loadGLFunctions() { _glGenQueries = glGenQueries; _glGetQueryObjectuiv = glGetQueryObjectuiv; #endif + _glBindBufferBase = glBindBufferBase; + _glGetUniformBlockIndex = glGetUniformBlockIndex; + _glUniformBlockBinding = glUniformBlockBinding; _glGetStringi = glGetStringi; #else // Load libGLESv3 if available. dlopen("libGLESv3.so", RTLD_NOW | RTLD_GLOBAL); + _glBindBufferBase = dlsym(RTLD_DEFAULT, "glBindBufferBase"); + _glGetUniformBlockIndex = dlsym(RTLD_DEFAULT, "glGetUniformBlockIndex"); + _glUniformBlockBinding = dlsym(RTLD_DEFAULT, "glUniformBlockBinding"); _glInvalidateFramebuffer = dlsym(RTLD_DEFAULT, "glInvalidateFramebuffer"); _glGetStringi = dlsym(RTLD_DEFAULT, "glGetStringi"); // Fall back to EXT_invalidate_framebuffer if available. @@ -159,6 +180,10 @@ func (f *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { C.glBindAttribLocation(C.GLuint(p.V), C.GLuint(a), cname) } +func (f *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { + C.gio_glBindBufferBase(C.GLenum(target), C.GLuint(index), C.GLuint(b.V)) +} + func (f *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { C.glBindBuffer(C.GLenum(target), C.GLuint(b.V)) } @@ -407,6 +432,12 @@ func (f *Functions) GetString(pname gl.Enum) string { } } +func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { + cname := C.CString(name) + defer C.free(unsafe.Pointer(cname)) + return uint(C.gio_glGetUniformBlockIndex(C.GLuint(p.V), cname)) +} + func (f *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { cname := C.CString(name) defer C.free(unsafe.Pointer(cname)) @@ -468,6 +499,10 @@ func (f *Functions) TexParameteri(target, pname gl.Enum, param int) { C.glTexParameteri(C.GLenum(target), C.GLenum(pname), C.GLint(param)) } +func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { + C.gio_glUniformBlockBinding(C.GLuint(p.V), C.GLuint(uniformBlockIndex), C.GLuint(uniformBlockBinding)) +} + func (f *Functions) Uniform1f(dst gl.Uniform, v float32) { C.glUniform1f(C.GLint(dst.V), C.GLfloat(v)) } diff --git a/app/internal/glimpl/gl_js.go b/app/internal/glimpl/gl_js.go index 6fbb1443..e4291d03 100644 --- a/app/internal/glimpl/gl_js.go +++ b/app/internal/glimpl/gl_js.go @@ -62,6 +62,9 @@ func (f *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { func (f *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { f.Ctx.Call("bindBuffer", int(target), js.Value(b)) } +func (f *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { + f.Ctx.Call("bindBufferBase", int(target), index, js.Value(b)) +} func (f *Functions) BindFramebuffer(target gl.Enum, fb gl.Framebuffer) { f.Ctx.Call("bindFramebuffer", int(target), js.Value(fb)) } @@ -228,6 +231,9 @@ func (f *Functions) GetString(pname gl.Enum) string { return f.Ctx.Call("getParameter", int(pname)).String() } } +func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { + return uint(paramVal(f.Ctx.Call("getUniformBlockIndex", js.Value(p), name))) +} func (f *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { return gl.Uniform(f.Ctx.Call("getUniformLocation", js.Value(p), name)) } @@ -270,6 +276,9 @@ func (f *Functions) TexSubImage2D(target gl.Enum, level int, x, y, width, height func (f *Functions) TexParameteri(target, pname gl.Enum, param int) { f.Ctx.Call("texParameteri", int(target), int(pname), int(param)) } +func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { + f.Ctx.Call("uniformBlockBinding", js.Value(p), int(uniformBlockIndex), int(uniformBlockBinding)) +} func (f *Functions) Uniform1f(dst gl.Uniform, v float32) { f.Ctx.Call("uniform1f", js.Value(dst), v) } diff --git a/app/internal/glimpl/gl_windows.go b/app/internal/glimpl/gl_windows.go index e33d8195..4fe1d918 100644 --- a/app/internal/glimpl/gl_windows.go +++ b/app/internal/glimpl/gl_windows.go @@ -21,6 +21,7 @@ var ( _glBeginQuery = LibGLESv2.NewProc("glBeginQuery") _glBindAttribLocation = LibGLESv2.NewProc("glBindAttribLocation") _glBindBuffer = LibGLESv2.NewProc("glBindBuffer") + _glBindBufferBase = LibGLESv2.NewProc("glBindBufferBase") _glBindFramebuffer = LibGLESv2.NewProc("glBindFramebuffer") _glBindRenderbuffer = LibGLESv2.NewProc("glBindRenderbuffer") _glBindTexture = LibGLESv2.NewProc("glBindTexture") @@ -35,6 +36,7 @@ var ( _glCompileShader = LibGLESv2.NewProc("glCompileShader") _glGenBuffers = LibGLESv2.NewProc("glGenBuffers") _glGenFramebuffers = LibGLESv2.NewProc("glGenFramebuffers") + _glGetUniformBlockIndex = LibGLESv2.NewProc("glGetUniformBlockIndex") _glCreateProgram = LibGLESv2.NewProc("glCreateProgram") _glGenRenderbuffers = LibGLESv2.NewProc("glGenRenderbuffers") _glCreateShader = LibGLESv2.NewProc("glCreateShader") @@ -79,6 +81,7 @@ var ( _glTexImage2D = LibGLESv2.NewProc("glTexImage2D") _glTexSubImage2D = LibGLESv2.NewProc("glTexSubImage2D") _glTexParameteri = LibGLESv2.NewProc("glTexParameteri") + _glUniformBlockBinding = LibGLESv2.NewProc("glUniformBlockBinding") _glUniform1f = LibGLESv2.NewProc("glUniform1f") _glUniform1i = LibGLESv2.NewProc("glUniform1i") _glUniform2f = LibGLESv2.NewProc("glUniform2f") @@ -112,6 +115,9 @@ func (c *Functions) BindAttribLocation(p gl.Program, a gl.Attrib, name string) { func (c *Functions) BindBuffer(target gl.Enum, b gl.Buffer) { syscall.Syscall(_glBindBuffer.Addr(), 2, uintptr(target), uintptr(b.V), 0) } +func (c *Functions) BindBufferBase(target gl.Enum, index int, b gl.Buffer) { + syscall.Syscall(_glBindBufferBase.Addr(), 3, uintptr(target), uintptr(index), uintptr(b.V)) +} func (c *Functions) BindFramebuffer(target gl.Enum, fb gl.Framebuffer) { syscall.Syscall(_glBindFramebuffer.Addr(), 2, uintptr(target), uintptr(fb.V), 0) } @@ -246,6 +252,13 @@ func (c *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarg func (c *Functions) FramebufferTexture2D(target, attachment, texTarget gl.Enum, t gl.Texture, level int) { syscall.Syscall6(_glFramebufferTexture2D.Addr(), 5, uintptr(target), uintptr(attachment), uintptr(texTarget), uintptr(t.V), uintptr(level), 0) } +func (f *Functions) GetUniformBlockIndex(p gl.Program, name string) uint { + cname := cString(name) + c0 := &cname[0] + u, _, _ := syscall.Syscall(_glGetUniformBlockIndex.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0) + issue34474KeepAlive(c0) + return uint(u) +} func (c *Functions) GetBinding(pname gl.Enum) gl.Object { return gl.Object{uint(c.GetInteger(pname))} } @@ -297,7 +310,7 @@ func (c *Functions) GetUniformLocation(p gl.Program, name string) gl.Uniform { cname := cString(name) c0 := &cname[0] u, _, _ := syscall.Syscall(_glGetUniformLocation.Addr(), 2, uintptr(p.V), uintptr(unsafe.Pointer(c0)), 0) - issue34474KeepAlive(c) + issue34474KeepAlive(c0) return gl.Uniform{int(u)} } func (c *Functions) InvalidateFramebuffer(target, attachment gl.Enum) { @@ -348,6 +361,9 @@ func (c *Functions) TexSubImage2D(target gl.Enum, level int, x, y, width, height func (c *Functions) TexParameteri(target, pname gl.Enum, param int) { syscall.Syscall(_glTexParameteri.Addr(), 3, uintptr(target), uintptr(pname), uintptr(param)) } +func (f *Functions) UniformBlockBinding(p gl.Program, uniformBlockIndex uint, uniformBlockBinding uint) { + syscall.Syscall(_glUniformBlockBinding.Addr(), 3, uintptr(p.V), uintptr(uniformBlockIndex), uintptr(uniformBlockBinding)) +} func (c *Functions) Uniform1f(dst gl.Uniform, v float32) { syscall.Syscall(_glUniform1f.Addr(), 2, uintptr(dst.V), uintptr(math.Float32bits(v)), 0) }