mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
internal/buffered: refactoring
This commit is contained in:
parent
bf27f25e26
commit
0eb2f76422
@ -23,24 +23,20 @@ var (
|
||||
// delayedCommands represents a queue for image operations that are ordered before the game starts
|
||||
// (BeginFrame). Before the game starts, the package shareable doesn't determine the minimum/maximum texture
|
||||
// sizes (#879).
|
||||
delayedCommands = []func() error{}
|
||||
delayedCommands = []func(){}
|
||||
|
||||
delayedCommandsM sync.Mutex
|
||||
delayedCommandsFlushed uint32
|
||||
)
|
||||
|
||||
func flushDelayedCommands() error {
|
||||
func flushDelayedCommands() {
|
||||
fs := getDelayedFuncsAndClear()
|
||||
for _, f := range fs {
|
||||
if err := f(); err != nil {
|
||||
return err
|
||||
}
|
||||
f()
|
||||
}
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func getDelayedFuncsAndClear() []func() error {
|
||||
func getDelayedFuncsAndClear() []func() {
|
||||
if atomic.LoadUint32(&delayedCommandsFlushed) == 0 {
|
||||
// Outline the slow-path to expect the fast-path is inlined.
|
||||
return getDelayedFuncsAndClearSlow()
|
||||
@ -48,14 +44,14 @@ func getDelayedFuncsAndClear() []func() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getDelayedFuncsAndClearSlow() []func() error {
|
||||
func getDelayedFuncsAndClearSlow() []func() {
|
||||
delayedCommandsM.Lock()
|
||||
defer delayedCommandsM.Unlock()
|
||||
|
||||
if delayedCommandsFlushed == 0 {
|
||||
defer atomic.StoreUint32(&delayedCommandsFlushed, 1)
|
||||
|
||||
fs := make([]func() error, len(delayedCommands))
|
||||
fs := make([]func(), len(delayedCommands))
|
||||
copy(fs, delayedCommands)
|
||||
delayedCommands = nil
|
||||
return fs
|
||||
@ -71,13 +67,13 @@ func maybeCanAddDelayedCommand() bool {
|
||||
return atomic.LoadUint32(&delayedCommandsFlushed) == 0
|
||||
}
|
||||
|
||||
func tryAddDelayedCommand(f func() error) bool {
|
||||
func tryAddDelayedCommand(f func()) bool {
|
||||
delayedCommandsM.Lock()
|
||||
defer delayedCommandsM.Unlock()
|
||||
|
||||
if delayedCommandsFlushed == 0 {
|
||||
delayedCommands = append(delayedCommands, func() error {
|
||||
return f()
|
||||
delayedCommands = append(delayedCommands, func() {
|
||||
f()
|
||||
})
|
||||
return true
|
||||
}
|
||||
|
@ -38,7 +38,8 @@ func BeginFrame(graphicsDriver graphicsdriver.Graphics) error {
|
||||
if err := atlas.BeginFrame(graphicsDriver); err != nil {
|
||||
return err
|
||||
}
|
||||
return flushDelayedCommands()
|
||||
flushDelayedCommands()
|
||||
return nil
|
||||
}
|
||||
|
||||
func EndFrame(graphicsDriver graphicsdriver.Graphics) error {
|
||||
@ -56,9 +57,8 @@ func NewImage(width, height int, imageType atlas.ImageType) *Image {
|
||||
|
||||
func (i *Image) initialize(imageType atlas.ImageType) {
|
||||
if maybeCanAddDelayedCommand() {
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
i.initialize(imageType)
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
@ -87,9 +87,8 @@ func (i *Image) resolvePendingPixels(keepPendingPixels bool) {
|
||||
|
||||
func (i *Image) MarkDisposed() {
|
||||
if maybeCanAddDelayedCommand() {
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
i.MarkDisposed()
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
@ -137,9 +136,8 @@ func (i *Image) ReplacePixels(pix []byte, x, y, width, height int) {
|
||||
if maybeCanAddDelayedCommand() {
|
||||
copied := make([]byte, len(pix))
|
||||
copy(copied, pix)
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
i.ReplacePixels(copied, x, y, width, height)
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
@ -192,10 +190,9 @@ func (i *Image) DrawTriangles(srcs [graphics.ShaderImageNum]*Image, vertices []f
|
||||
}
|
||||
|
||||
if maybeCanAddDelayedCommand() {
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
// Arguments are not copied. Copying is the caller's responsibility.
|
||||
i.DrawTriangles(srcs, vertices, indices, colorm, mode, filter, address, dstRegion, srcRegion, subimageOffsets, shader, uniforms, evenOdd)
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
@ -236,9 +233,8 @@ func NewShader(ir *shaderir.Program) *Shader {
|
||||
|
||||
func (s *Shader) initialize(ir *shaderir.Program) {
|
||||
if maybeCanAddDelayedCommand() {
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
s.initialize(ir)
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
@ -248,9 +244,8 @@ func (s *Shader) initialize(ir *shaderir.Program) {
|
||||
|
||||
func (s *Shader) MarkDisposed() {
|
||||
if maybeCanAddDelayedCommand() {
|
||||
if tryAddDelayedCommand(func() error {
|
||||
if tryAddDelayedCommand(func() {
|
||||
s.MarkDisposed()
|
||||
return nil
|
||||
}) {
|
||||
return
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user