mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
internal/graphicsdriver/metal: Separate GCing the buffers
Updates #1196
This commit is contained in:
parent
edc2f8b961
commit
337d8d5113
@ -388,13 +388,7 @@ func pow2(x uintptr) uintptr {
|
|||||||
return p2
|
return p2
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *Graphics) availableBuffer(length uintptr) mtl.Buffer {
|
func (g *Graphics) gcBuffers() {
|
||||||
if g.cb == (mtl.CommandBuffer{}) {
|
|
||||||
g.cb = g.cq.MakeCommandBuffer()
|
|
||||||
}
|
|
||||||
|
|
||||||
var newBuf mtl.Buffer
|
|
||||||
|
|
||||||
for cb, bs := range g.buffers {
|
for cb, bs := range g.buffers {
|
||||||
// If the command buffer still lives, the buffer must not be updated.
|
// If the command buffer still lives, the buffer must not be updated.
|
||||||
// TODO: Handle an error?
|
// TODO: Handle an error?
|
||||||
@ -403,10 +397,6 @@ func (g *Graphics) availableBuffer(length uintptr) mtl.Buffer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, b := range bs {
|
for _, b := range bs {
|
||||||
if newBuf == (mtl.Buffer{}) && b.Length() >= length {
|
|
||||||
newBuf = b
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if g.unusedBuffers == nil {
|
if g.unusedBuffers == nil {
|
||||||
g.unusedBuffers = map[mtl.Buffer]struct{}{}
|
g.unusedBuffers = map[mtl.Buffer]struct{}{}
|
||||||
}
|
}
|
||||||
@ -416,15 +406,6 @@ func (g *Graphics) availableBuffer(length uintptr) mtl.Buffer {
|
|||||||
cb.Release()
|
cb.Release()
|
||||||
}
|
}
|
||||||
|
|
||||||
for b := range g.unusedBuffers {
|
|
||||||
if b.Length() >= length {
|
|
||||||
newBuf = b
|
|
||||||
delete(g.unusedBuffers, b)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GC unused buffers.
|
|
||||||
const maxUnusedBuffers = 10
|
const maxUnusedBuffers = 10
|
||||||
if len(g.unusedBuffers) > maxUnusedBuffers {
|
if len(g.unusedBuffers) > maxUnusedBuffers {
|
||||||
bufs := make([]mtl.Buffer, 0, len(g.unusedBuffers))
|
bufs := make([]mtl.Buffer, 0, len(g.unusedBuffers))
|
||||||
@ -439,6 +420,21 @@ func (g *Graphics) availableBuffer(length uintptr) mtl.Buffer {
|
|||||||
b.Release()
|
b.Release()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Graphics) availableBuffer(length uintptr) mtl.Buffer {
|
||||||
|
if g.cb == (mtl.CommandBuffer{}) {
|
||||||
|
g.cb = g.cq.MakeCommandBuffer()
|
||||||
|
}
|
||||||
|
|
||||||
|
var newBuf mtl.Buffer
|
||||||
|
for b := range g.unusedBuffers {
|
||||||
|
if b.Length() >= length {
|
||||||
|
newBuf = b
|
||||||
|
delete(g.unusedBuffers, b)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if newBuf == (mtl.Buffer{}) {
|
if newBuf == (mtl.Buffer{}) {
|
||||||
newBuf = g.view.getMTLDevice().MakeBufferWithLength(pow2(length), resourceStorageMode)
|
newBuf = g.view.getMTLDevice().MakeBufferWithLength(pow2(length), resourceStorageMode)
|
||||||
@ -1228,6 +1224,8 @@ func (i *Image) mtlTexture() mtl.Texture {
|
|||||||
return mtl.Texture{}
|
return mtl.Texture{}
|
||||||
}
|
}
|
||||||
g.screenDrawable = drawable
|
g.screenDrawable = drawable
|
||||||
|
// After nextDrawable, it is expected some command buffers are completed.
|
||||||
|
g.gcBuffers()
|
||||||
}
|
}
|
||||||
return g.screenDrawable.Texture()
|
return g.screenDrawable.Texture()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user