From 8754a5edfae0e061ebe5865eaba1f2c5fc0edc45 Mon Sep 17 00:00:00 2001 From: sergystepanov Date: Fri, 26 Dec 2025 16:17:37 +0300 Subject: [PATCH] Tweak OpenGL framebuffer Force alignment for GL ReadPixels and skip unbinding last framebuffer which makes it a bit faster. --- pkg/worker/caged/libretro/graphics/gl/gl.go | 11 +++++++++++ pkg/worker/caged/libretro/graphics/opengl.go | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/pkg/worker/caged/libretro/graphics/gl/gl.go b/pkg/worker/caged/libretro/graphics/gl/gl.go index d8f95a62..46e3842e 100644 --- a/pkg/worker/caged/libretro/graphics/gl/gl.go +++ b/pkg/worker/caged/libretro/graphics/gl/gl.go @@ -78,6 +78,7 @@ typedef void (APIENTRYP GPREADPIXELS)(GLint x, GLint y, GLsizei width, GLsizei h typedef void (APIENTRYP GPRENDERBUFFERSTORAGE)(GLenum target, GLenum internalformat, GLsizei width, GLsizei height); typedef void (APIENTRYP GPTEXIMAGE2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels); typedef void (APIENTRYP GPTEXPARAMETERI)(GLenum target, GLenum pname, GLint param); +typedef void (APIENTRYP GPPIXELSTOREI)(GLenum pname, GLint param); static const GLubyte *getString(GPGETSTRING ptr, GLenum name) { return (*ptr)(name); } static GLenum getError(GPGETERROR ptr) { return (*ptr)(); } @@ -113,6 +114,7 @@ static void deleteTextures(GPDELETETEXTURES ptr, GLsizei n, const GLuint *textur static void readPixels(GPREADPIXELS ptr, GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels) { (*ptr)(x, y, width, height, format, type, pixels); } +static void pixelStorei(GPPIXELSTOREI ptr, GLenum pname, GLint param) { (*ptr)(pname, param); } */ import "C" import ( @@ -144,6 +146,8 @@ const ( UnsignedShort5551 = 0x8034 UnsignedShort565 = 0x8363 UnsignedInt8888Rev = 0x8367 + + PackAlignment = 0x0D05 ) var ( @@ -165,6 +169,7 @@ var ( gpDeleteFramebuffers C.GPDELETEFRAMEBUFFERS gpDeleteTextures C.GPDELETETEXTURES gpReadPixels C.GPREADPIXELS + gpPixelStorei C.GPPIXELSTOREI ) func InitWithProcAddrFunc(getProcAddr func(name string) unsafe.Pointer) error { @@ -205,6 +210,9 @@ func InitWithProcAddrFunc(getProcAddr func(name string) unsafe.Pointer) error { if gpReadPixels == nil { return errors.New("glReadPixels") } + if gpPixelStorei = (C.GPPIXELSTOREI)(getProcAddr("glPixelStorei")); gpPixelStorei == nil { + return errors.New("glPixelStorei") + } return nil } @@ -257,6 +265,9 @@ func DeleteTextures(n int32, textures *uint32) { func ReadPixels(x int32, y int32, width int32, height int32, format uint32, xtype uint32, pixels unsafe.Pointer) { C.readPixels(gpReadPixels, (C.GLint)(x), (C.GLint)(y), (C.GLsizei)(width), (C.GLsizei)(height), (C.GLenum)(format), (C.GLenum)(xtype), pixels) } +func PixelStorei(pname uint32, param int32) { + C.pixelStorei(gpPixelStorei, (C.GLenum)(pname), (C.GLint)(param)) +} func GetError() uint32 { return (uint32)(C.getError(gpGetError)) } diff --git a/pkg/worker/caged/libretro/graphics/opengl.go b/pkg/worker/caged/libretro/graphics/opengl.go index 99eef10d..44a9a92f 100644 --- a/pkg/worker/caged/libretro/graphics/opengl.go +++ b/pkg/worker/caged/libretro/graphics/opengl.go @@ -110,10 +110,10 @@ func destroyFramebuffer() { } func ReadFramebuffer(bytes, w, h uint) []byte { - data := buf[:bytes] + data := buf[:bytes:bytes] + gl.PixelStorei(gl.PackAlignment, 1) gl.BindFramebuffer(gl.FRAMEBUFFER, opt.fbo) gl.ReadPixels(0, 0, int32(w), int32(h), opt.pixType, opt.pixFormat, unsafe.Pointer(&data[0])) - gl.BindFramebuffer(gl.FRAMEBUFFER, 0) return data }