app/internal/glimpl: add gl functions for uniform buffers

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2020-02-24 13:22:55 +01:00
parent 23757b1022
commit 3a5a2cff6b
3 changed files with 61 additions and 1 deletions
+35
View File
@@ -41,6 +41,9 @@ import (
#include <GLES3/gl3.h>
#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))
}
+9
View File
@@ -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)
}
+17 -1
View File
@@ -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)
}