From 965fd4cac8e58f8e05ab1a98349ac8b9a3440a90 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 25 Feb 2023 23:11:39 +0900 Subject: [PATCH] internal/restoring: bug fix: stop keeping pixel data on 32bit architecture Updates #4259 --- internal/restorable/image.go | 7 +++++++ internal/restorable/images.go | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/internal/restorable/image.go b/internal/restorable/image.go index 5e009e7e9..ef7c8703a 100644 --- a/internal/restorable/image.go +++ b/internal/restorable/image.go @@ -446,6 +446,13 @@ func (i *Image) readPixelsFromGPUIfNeeded(graphicsDriver graphicsdriver.Graphics } func (i *Image) ReadPixels(graphicsDriver graphicsdriver.Graphics, pixels []byte, x, y, width, height int) error { + if alwaysReadPixelsFromGPU() { + if err := i.image.ReadPixels(graphicsDriver, pixels, x, y, width, height); err != nil { + return err + } + return nil + } + if err := i.readPixelsFromGPUIfNeeded(graphicsDriver); err != nil { return err } diff --git a/internal/restorable/images.go b/internal/restorable/images.go index 6730bac7d..c49a9111f 100644 --- a/internal/restorable/images.go +++ b/internal/restorable/images.go @@ -16,6 +16,7 @@ package restorable import ( "runtime" + "unsafe" "github.com/hajimehoshi/ebiten/v2/internal/debug" "github.com/hajimehoshi/ebiten/v2/internal/graphicscommand" @@ -32,6 +33,12 @@ func needsRestoring() bool { return forceRestoring || needsRestoringByGraphicsDriver } +// alwaysReadPixelsFromGPU reports whether ReadPixels alwasy reads pixels from GPU or not. +// This is true for low-end machines like 32bit architecture without much memory. +func alwaysReadPixelsFromGPU() bool { + return !needsRestoring() && unsafe.Sizeof(uintptr(0)) < 8 +} + // EnableRestoringForTesting forces to enable restoring for testing. func EnableRestoringForTesting() { forceRestoring = true