internal/restoring: bug fix: stop keeping pixel data on 32bit architecture

Updates #4259
This commit is contained in:
Hajime Hoshi 2023-02-25 23:11:39 +09:00
parent a0a80bbc1f
commit 965fd4cac8
2 changed files with 14 additions and 0 deletions

View File

@ -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 { 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 { if err := i.readPixelsFromGPUIfNeeded(graphicsDriver); err != nil {
return err return err
} }

View File

@ -16,6 +16,7 @@ package restorable
import ( import (
"runtime" "runtime"
"unsafe"
"github.com/hajimehoshi/ebiten/v2/internal/debug" "github.com/hajimehoshi/ebiten/v2/internal/debug"
"github.com/hajimehoshi/ebiten/v2/internal/graphicscommand" "github.com/hajimehoshi/ebiten/v2/internal/graphicscommand"
@ -32,6 +33,12 @@ func needsRestoring() bool {
return forceRestoring || needsRestoringByGraphicsDriver 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. // EnableRestoringForTesting forces to enable restoring for testing.
func EnableRestoringForTesting() { func EnableRestoringForTesting() {
forceRestoring = true forceRestoring = true