(Swift/macos) dont make ThermionFlutterTexture inherit from ThermionDartTexture; reuse render callbacks/resource loader functions; add check for concurrent calls to destroyTexture
This commit is contained in:
@@ -9,6 +9,8 @@ public class SwiftThermionFlutterPlugin: NSObject, FlutterPlugin {
|
|||||||
|
|
||||||
var createdAt = Date()
|
var createdAt = Date()
|
||||||
|
|
||||||
|
var destroying = false
|
||||||
|
|
||||||
var resources:[UInt32:NSData] = [:]
|
var resources:[UInt32:NSData] = [:]
|
||||||
|
|
||||||
static var messenger : FlutterBinaryMessenger? = nil;
|
static var messenger : FlutterBinaryMessenger? = nil;
|
||||||
@@ -70,43 +72,54 @@ public class SwiftThermionFlutterPlugin: NSObject, FlutterPlugin {
|
|||||||
registrar.addMethodCallDelegate(instance, channel: channel)
|
registrar.addMethodCallDelegate(instance, channel: channel)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var resourceLoaderWrapper:UnsafeMutablePointer<ResourceLoaderWrapper>? = nil
|
||||||
|
var renderCallbackHolder:[Any] = []
|
||||||
|
|
||||||
init(textureRegistry: FlutterTextureRegistry, registrar:FlutterPluginRegistrar) {
|
init(textureRegistry: FlutterTextureRegistry, registrar:FlutterPluginRegistrar) {
|
||||||
self.registry = textureRegistry;
|
self.registry = textureRegistry;
|
||||||
self.registrar = registrar
|
self.registrar = registrar
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
|
||||||
let methodName = call.method;
|
let methodName = call.method;
|
||||||
switch methodName {
|
switch methodName {
|
||||||
case "getResourceLoaderWrapper":
|
case "getResourceLoaderWrapper":
|
||||||
var resourceLoaderWrapper = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque())
|
if(resourceLoaderWrapper == nil) {
|
||||||
result(unsafeBitCast(resourceLoaderWrapper, to:Int64.self))
|
resourceLoaderWrapper = make_resource_loader(loadResource, freeResource, Unmanaged.passUnretained(self).toOpaque())
|
||||||
|
}
|
||||||
|
result(Int64(Int(bitPattern: resourceLoaderWrapper!)))
|
||||||
case "getRenderCallback":
|
case "getRenderCallback":
|
||||||
let renderCallback = markTextureFrameAvailable
|
if(renderCallbackHolder.isEmpty) {
|
||||||
let resultArray:[Any] = [
|
renderCallbackHolder.append(unsafeBitCast(markTextureFrameAvailable, to:Int64.self))
|
||||||
unsafeBitCast(renderCallback, to:Int64.self), unsafeBitCast(Unmanaged.passUnretained(self), to:UInt64.self)]
|
renderCallbackHolder.append(unsafeBitCast(Unmanaged.passUnretained(self), to:UInt64.self))
|
||||||
result(resultArray)
|
}
|
||||||
|
result(renderCallbackHolder)
|
||||||
case "getDriverPlatform":
|
case "getDriverPlatform":
|
||||||
result(nil)
|
result(nil)
|
||||||
case "getSharedContext":
|
case "getSharedContext":
|
||||||
result(nil)
|
result(nil)
|
||||||
case "createTexture":
|
case "createTexture":
|
||||||
|
if(destroying) {
|
||||||
|
result(nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
let args = call.arguments as! [Any]
|
let args = call.arguments as! [Any]
|
||||||
let width = args[0] as! Int64
|
let width = args[0] as! Int64
|
||||||
let height = args[1] as! Int64
|
let height = args[1] as! Int64
|
||||||
|
|
||||||
self.texture = ThermionFlutterTexture(registry: registry, width: width, height: height)
|
self.texture = ThermionFlutterTexture(registry: registry, width: width, height: height)
|
||||||
|
|
||||||
if(self.texture?.metalTextureAddress == -1) {
|
if(self.texture!.texture.metalTextureAddress == -1) {
|
||||||
result(nil)
|
result(nil)
|
||||||
} else {
|
} else {
|
||||||
result([self.texture!.flutterTextureId as Any, self.texture?.metalTextureAddress, nil])
|
result([self.texture!.flutterTextureId as Any, self.texture!.texture.metalTextureAddress, nil])
|
||||||
}
|
}
|
||||||
case "destroyTexture":
|
case "destroyTexture":
|
||||||
|
self.destroying = true
|
||||||
self.texture?.destroy()
|
self.texture?.destroy()
|
||||||
self.texture = nil
|
self.texture = nil
|
||||||
result(true)
|
result(true)
|
||||||
|
self.destroying = false
|
||||||
default:
|
default:
|
||||||
result(FlutterMethodNotImplemented)
|
result(FlutterMethodNotImplemented)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user