mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 03:08:54 +01:00
graphicsdriver/metal: Use NSAutoreleasePool to release drawable correctly
Fixes #847
This commit is contained in:
parent
bfe1d2208e
commit
a064955a13
@ -20,6 +20,8 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type Graphics interface {
|
type Graphics interface {
|
||||||
|
Begin()
|
||||||
|
End()
|
||||||
SetWindow(window uintptr)
|
SetWindow(window uintptr)
|
||||||
SetVertices(vertices []float32, indices []uint16)
|
SetVertices(vertices []float32, indices []uint16)
|
||||||
Flush()
|
Flush()
|
||||||
|
@ -159,6 +159,8 @@ func (q *commandQueue) Flush() {
|
|||||||
if recordLog() {
|
if recordLog() {
|
||||||
fmt.Println("--")
|
fmt.Println("--")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
theGraphicsDriver.Begin()
|
||||||
for len(q.commands) > 0 {
|
for len(q.commands) > 0 {
|
||||||
nv := 0
|
nv := 0
|
||||||
ne := 0
|
ne := 0
|
||||||
@ -199,6 +201,7 @@ func (q *commandQueue) Flush() {
|
|||||||
}
|
}
|
||||||
q.commands = q.commands[nc:]
|
q.commands = q.commands[nc:]
|
||||||
}
|
}
|
||||||
|
theGraphicsDriver.End()
|
||||||
q.commands = nil
|
q.commands = nil
|
||||||
q.nvertices = 0
|
q.nvertices = 0
|
||||||
q.nindices = 0
|
q.nindices = 0
|
||||||
|
@ -30,6 +30,20 @@ import (
|
|||||||
"github.com/hajimehoshi/ebiten/internal/mainthread"
|
"github.com/hajimehoshi/ebiten/internal/mainthread"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// #cgo CFLAGS: -x objective-c -mmacosx-version-min=10.11
|
||||||
|
// #cgo LDFLAGS: -framework Foundation
|
||||||
|
//
|
||||||
|
// #import <Foundation/Foundation.h>
|
||||||
|
//
|
||||||
|
// static void* allocAutoreleasePool() {
|
||||||
|
// return [[NSAutoreleasePool alloc] init];
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// static void releaseAutoreleasePool(void* pool) {
|
||||||
|
// [(NSAutoreleasePool*)pool release];
|
||||||
|
// }
|
||||||
|
import "C"
|
||||||
|
|
||||||
const source = `#include <metal_stdlib>
|
const source = `#include <metal_stdlib>
|
||||||
|
|
||||||
#define FILTER_NEAREST {{.FilterNearest}}
|
#define FILTER_NEAREST {{.FilterNearest}}
|
||||||
@ -287,6 +301,8 @@ type Driver struct {
|
|||||||
dst *Image
|
dst *Image
|
||||||
|
|
||||||
maxImageSize int
|
maxImageSize int
|
||||||
|
|
||||||
|
pool unsafe.Pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
var theDriver Driver
|
var theDriver Driver
|
||||||
@ -295,6 +311,23 @@ func Get() *Driver {
|
|||||||
return &theDriver
|
return &theDriver
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) Begin() {
|
||||||
|
// NSAutoreleasePool is required to release drawable correctly (#847).
|
||||||
|
// https://developer.apple.com/library/archive/documentation/3DDrawing/Conceptual/MTLBestPracticesGuide/Drawables.html
|
||||||
|
mainthread.Run(func() error {
|
||||||
|
d.pool = C.allocAutoreleasePool()
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Driver) End() {
|
||||||
|
mainthread.Run(func() error {
|
||||||
|
C.releaseAutoreleasePool(d.pool)
|
||||||
|
d.pool = nil
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) SetWindow(window uintptr) {
|
func (d *Driver) SetWindow(window uintptr) {
|
||||||
mainthread.Run(func() error {
|
mainthread.Run(func() error {
|
||||||
// Note that [NSApp mainWindow] returns nil when the window is borderless.
|
// Note that [NSApp mainWindow] returns nil when the window is borderless.
|
||||||
|
@ -33,6 +33,14 @@ type Driver struct {
|
|||||||
context context
|
context context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *Driver) Begin() {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Driver) End() {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
func (d *Driver) SetWindow(window uintptr) {
|
func (d *Driver) SetWindow(window uintptr) {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user