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:
Elias Naur
2022-10-22 11:04:22 -06:00
parent e69ef4f0b4
commit bebc73db37
19 changed files with 233 additions and 38 deletions
+11
View File
@@ -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))}
}