(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:
Nick Fisher
2024-06-19 13:20:04 +08:00
parent 3468e7da55
commit 534e5b46a8

View File

@@ -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)
} }