From e4a927982de51dacb602c667f888e6748a351fc5 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 22 Feb 2020 08:29:45 +0100 Subject: [PATCH] gpu: add Framebuffer.ReadPixels Signed-off-by: Elias Naur --- gpu/backend.go | 1 + gpu/gl/backend.go | 10 ++++++++++ gpu/gl/gl.go | 1 + 3 files changed, 12 insertions(+) diff --git a/gpu/backend.go b/gpu/backend.go index 88e30b9e..32000d1c 100644 --- a/gpu/backend.go +++ b/gpu/backend.go @@ -127,6 +127,7 @@ type Framebuffer interface { Bind() Invalidate() Release() + ReadPixels(src image.Rectangle, pixels []byte) error } type Timer interface { diff --git a/gpu/gl/backend.go b/gpu/gl/backend.go index a5e38f27..033693fd 100644 --- a/gpu/gl/backend.go +++ b/gpu/gl/backend.go @@ -589,6 +589,16 @@ func (b *gpuBuffer) BindIndex() { b.backend.funcs.BindBuffer(ELEMENT_ARRAY_BUFFER, b.obj) } +func (f *gpuFramebuffer) ReadPixels(src image.Rectangle, pixels []byte) error { + glErr(f.funcs) + f.Bind() + if len(pixels) < src.Dx()*src.Dy() { + return errors.New("unexpected RGBA size") + } + f.funcs.ReadPixels(src.Min.X, src.Min.Y, src.Dx(), src.Dy(), RGBA, UNSIGNED_BYTE, pixels) + return glErr(f.funcs) +} + func (f *gpuFramebuffer) Bind() { f.funcs.BindFramebuffer(FRAMEBUFFER, f.obj) } diff --git a/gpu/gl/gl.go b/gpu/gl/gl.go index 8dcb757f..41cb67eb 100644 --- a/gpu/gl/gl.go +++ b/gpu/gl/gl.go @@ -139,6 +139,7 @@ type Functions interface { GetUniformLocation(p Program, name string) Uniform InvalidateFramebuffer(target, attachment Enum) LinkProgram(p Program) + ReadPixels(x, y, width, height int, format, ty Enum, data []byte) RenderbufferStorage(target, internalformat Enum, width, height int) ShaderSource(s Shader, src string) TexImage2D(target Enum, level int, internalFormat int, width, height int, format, ty Enum, data []byte)