mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-03 16:35:36 +00:00
gpu: implement automatic mipmaps for images
All GPU APIs except OpenGL ES 2 can generate mipmaps for textures. This trades 33% more GPU memory use for improved rendering quality and speed for downscaled images. Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
@@ -56,6 +56,7 @@ const (
|
||||
GREATER = 0x204
|
||||
GEQUAL = 0x206
|
||||
LINEAR = 0x2601
|
||||
LINEAR_MIPMAP_LINEAR = 0x2703
|
||||
LINK_STATUS = 0x8b82
|
||||
LUMINANCE = 0x1909
|
||||
MAP_READ_BIT = 0x0001
|
||||
|
||||
@@ -72,6 +72,7 @@ type Functions struct {
|
||||
_flush js.Value
|
||||
_framebufferRenderbuffer js.Value
|
||||
_framebufferTexture2D js.Value
|
||||
_generateMipmap js.Value
|
||||
_getRenderbufferParameteri js.Value
|
||||
_getFramebufferAttachmentParameter js.Value
|
||||
_getParameter js.Value
|
||||
@@ -167,6 +168,7 @@ func NewFunctions(ctx Context, forceES bool) (*Functions, error) {
|
||||
_flush: _bind(webgl, `flush`),
|
||||
_framebufferRenderbuffer: _bind(webgl, `framebufferRenderbuffer`),
|
||||
_framebufferTexture2D: _bind(webgl, `framebufferTexture2D`),
|
||||
_generateMipmap: _bind(webgl, `generateMipmap`),
|
||||
_getRenderbufferParameteri: _bind(webgl, `getRenderbufferParameteri`),
|
||||
_getFramebufferAttachmentParameter: _bind(webgl, `getFramebufferAttachmentParameter`),
|
||||
_getParameter: _bind(webgl, `getParameter`),
|
||||
@@ -419,6 +421,9 @@ func (f *Functions) FramebufferRenderbuffer(target, attachment, renderbuffertarg
|
||||
func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t Texture, level int) {
|
||||
f._framebufferTexture2D.Invoke(int(target), int(attachment), int(texTarget), js.Value(t), level)
|
||||
}
|
||||
func (f *Functions) GenerateMipmap(target Enum) {
|
||||
f._generateMipmap.Invoke(int(target))
|
||||
}
|
||||
func (f *Functions) GetError() Enum {
|
||||
// Avoid slow getError calls. See gio#179.
|
||||
return 0
|
||||
|
||||
@@ -72,6 +72,7 @@ typedef void (*_glFlush)(void);
|
||||
typedef void (*_glFramebufferRenderbuffer)(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
|
||||
typedef void (*_glFramebufferTexture2D)(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
||||
typedef void (*_glGenBuffers)(GLsizei n, GLuint *buffers);
|
||||
typedef void (*_glGenerateMipmap)(GLenum target);
|
||||
typedef void (*_glGenFramebuffers)(GLsizei n, GLuint *framebuffers);
|
||||
typedef void (*_glGenRenderbuffers)(GLsizei n, GLuint *renderbuffers);
|
||||
typedef void (*_glGenTextures)(GLsizei n, GLuint *textures);
|
||||
@@ -286,6 +287,10 @@ static void glGenBuffers(_glGenBuffers f, GLsizei n, GLuint *buffers) {
|
||||
f(n, buffers);
|
||||
}
|
||||
|
||||
static void glGenerateMipmap(_glGenerateMipmap f, GLenum target) {
|
||||
f(target);
|
||||
}
|
||||
|
||||
static void glGenFramebuffers(_glGenFramebuffers f, GLsizei n, GLuint *framebuffers) {
|
||||
f(n, framebuffers);
|
||||
}
|
||||
@@ -561,6 +566,7 @@ type Functions struct {
|
||||
glFramebufferRenderbuffer C._glFramebufferRenderbuffer
|
||||
glFramebufferTexture2D C._glFramebufferTexture2D
|
||||
glGenBuffers C._glGenBuffers
|
||||
glGenerateMipmap C._glGenerateMipmap
|
||||
glGenFramebuffers C._glGenFramebuffers
|
||||
glGenRenderbuffers C._glGenRenderbuffers
|
||||
glGenTextures C._glGenTextures
|
||||
@@ -723,6 +729,7 @@ func (f *Functions) load(forceES bool) error {
|
||||
f.glFramebufferRenderbuffer = must("glFramebufferRenderbuffer")
|
||||
f.glFramebufferTexture2D = must("glFramebufferTexture2D")
|
||||
f.glGenBuffers = must("glGenBuffers")
|
||||
f.glGenerateMipmap = must("glGenerateMipmap")
|
||||
f.glGenFramebuffers = must("glGenFramebuffers")
|
||||
f.glGenRenderbuffers = must("glGenRenderbuffers")
|
||||
f.glGenTextures = must("glGenTextures")
|
||||
@@ -1048,6 +1055,10 @@ func (f *Functions) FramebufferTexture2D(target, attachment, texTarget Enum, t T
|
||||
C.glFramebufferTexture2D(f.glFramebufferTexture2D, C.GLenum(target), C.GLenum(attachment), C.GLenum(texTarget), C.GLuint(t.V), C.GLint(level))
|
||||
}
|
||||
|
||||
func (f *Functions) GenerateMipmap(target Enum) {
|
||||
C.glGenerateMipmap(f.glGenerateMipmap, C.GLenum(target))
|
||||
}
|
||||
|
||||
func (c *Functions) GetBinding(pname Enum) Object {
|
||||
return Object{uint(c.GetInteger(pname))}
|
||||
}
|
||||
|
||||
@@ -35,6 +35,7 @@ var (
|
||||
_glDeleteVertexArrays = LibGLESv2.NewProc("glDeleteVertexArrays")
|
||||
_glCompileShader = LibGLESv2.NewProc("glCompileShader")
|
||||
_glCopyTexSubImage2D = LibGLESv2.NewProc("glCopyTexSubImage2D")
|
||||
_glGenerateMipmap = LibGLESv2.NewProc("glGenerateMipmap")
|
||||
_glGenBuffers = LibGLESv2.NewProc("glGenBuffers")
|
||||
_glGenFramebuffers = LibGLESv2.NewProc("glGenFramebuffers")
|
||||
_glGenVertexArrays = LibGLESv2.NewProc("glGenVertexArrays")
|
||||
@@ -192,6 +193,9 @@ func (c *Functions) CompileShader(s Shader) {
|
||||
func (f *Functions) CopyTexSubImage2D(target Enum, level, xoffset, yoffset, x, y, width, height int) {
|
||||
syscall.Syscall9(_glCopyTexSubImage2D.Addr(), 8, uintptr(target), uintptr(level), uintptr(xoffset), uintptr(yoffset), uintptr(x), uintptr(y), uintptr(width), uintptr(height), 0)
|
||||
}
|
||||
func (f *Functions) GenerateMipmap(target Enum) {
|
||||
syscall.Syscall(_glGenerateMipmap.Addr(), 1, uintptr(target), 0, 0)
|
||||
}
|
||||
func (c *Functions) CreateBuffer() Buffer {
|
||||
var buf uintptr
|
||||
syscall.Syscall(_glGenBuffers.Addr(), 2, 1, uintptr(unsafe.Pointer(&buf)), 0)
|
||||
|
||||
Reference in New Issue
Block a user