update all void callbacks to accept an integer requestId

This commit is contained in:
Nick Fisher
2025-05-13 17:18:07 +08:00
parent 383fc221d9
commit dc5cdcb7e1
7 changed files with 50 additions and 47 deletions

View File

@@ -97,7 +97,7 @@ late NativeCallable<Void Function(Int32)>
_voidCallbackNativeCallable = NativeCallable<Void Function(Int32)>.listener(_voidCallbackHandler); _voidCallbackNativeCallable = NativeCallable<Void Function(Int32)>.listener(_voidCallbackHandler);
Future<void> withVoidCallback( Future<void> withVoidCallback(
Function(int, Pointer<NativeFunction<Void Function(int)>>) func) async { Function(int, Pointer<NativeFunction<Void Function(Int32)>>) func) async {
var requestId = _requestId; var requestId = _requestId;
_requestId++; _requestId++;
final completer = Completer(); final completer = Completer();
@@ -107,7 +107,6 @@ Future<void> withVoidCallback(
func.call(requestId, _voidCallbackNativeCallable.nativeFunction.cast()); func.call(requestId, _voidCallbackNativeCallable.nativeFunction.cast());
await completer.future; await completer.future;
// nativeCallable.close();
} }
Future<Pointer<T>> withPointerCallback<T extends NativeType>( Future<Pointer<T>> withPointerCallback<T extends NativeType>(

View File

@@ -227,8 +227,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
for (final swapChain in _swapChains.keys.toList()) { for (final swapChain in _swapChains.keys.toList()) {
await destroySwapChain(swapChain); await destroySwapChain(swapChain);
} }
await withVoidCallback((cb) async { await withVoidCallback((requestId, cb) async {
Engine_destroyRenderThread(engine, cb); Engine_destroyRenderThread(engine, requestId, cb);
}); });
RenderThread_destroy(); RenderThread_destroy();
@@ -248,7 +248,7 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
/// ///
Future destroyAsset(covariant FFIAsset asset) async { Future destroyAsset(covariant FFIAsset asset) async {
await withVoidCallback( await withVoidCallback(
(cb) => SceneAsset_destroyRenderThread(asset.asset, cb)); (requestId, cb) => SceneAsset_destroyRenderThread(asset.asset, requestId, cb));
await asset.dispose(); await asset.dispose();
} }
@@ -536,22 +536,23 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
Renderer_beginFrameRenderThread( Renderer_beginFrameRenderThread(
renderer, swapchain.swapChain, 0.toBigInt, cb); renderer, swapchain.swapChain, 0.toBigInt, cb);
}); });
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Renderer_renderRenderThread( Renderer_renderRenderThread(
renderer, renderer,
view.view, view.view,
requestId,
cb, cb,
); );
}); });
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Renderer_endFrameRenderThread(renderer, cb); Renderer_endFrameRenderThread(renderer, requestId, cb);
}); });
if (FILAMENT_SINGLE_THREADED) { if (FILAMENT_SINGLE_THREADED) {
await withVoidCallback((cb) => Engine_executeRenderThread(engine, cb)); await withVoidCallback((requestId, cb) => Engine_executeRenderThread(engine, requestId, cb));
} else { } else {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_flushAndWaitRenderThread(engine, cb)); (requestId, cb) => Engine_flushAndWaitRenderThread(engine, requestId, cb));
} }
} }
@@ -723,10 +724,11 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
final viewport = await view.getViewport(); final viewport = await view.getViewport();
final pixelBuffer = final pixelBuffer =
Uint8List(viewport.width * viewport.height * 4 * sizeOf<Float>()); Uint8List(viewport.width * viewport.height * 4 * sizeOf<Float>());
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Renderer_renderRenderThread( Renderer_renderRenderThread(
renderer, renderer,
view.view, view.view,
requestId,
cb, cb,
); );
}); });
@@ -734,7 +736,7 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
if (captureRenderTarget && view.renderTarget == null) { if (captureRenderTarget && view.renderTarget == null) {
throw Exception(); throw Exception();
} }
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Renderer_readPixelsRenderThread( Renderer_readPixelsRenderThread(
renderer, renderer,
view.view, view.view,
@@ -749,20 +751,21 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
pixelDataType.value, pixelDataType.value,
pixelBuffer.address, pixelBuffer.address,
pixelBuffer.length, pixelBuffer.length,
requestId,
cb); cb);
}); });
pixelBuffers.add((view, pixelBuffer)); pixelBuffers.add((view, pixelBuffer));
} }
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Renderer_endFrameRenderThread(renderer, cb); Renderer_endFrameRenderThread(renderer, requestId, cb);
}); });
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
if (FILAMENT_SINGLE_THREADED) { if (FILAMENT_SINGLE_THREADED) {
Engine_executeRenderThread(engine, cb); Engine_executeRenderThread(engine, requestId, cb);
} else { } else {
Engine_flushAndWaitRenderThread(engine, cb); Engine_flushAndWaitRenderThread(engine, requestId, cb);
} }
}); });
return pixelBuffers; return pixelBuffers;
@@ -823,12 +826,13 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
resources.add(FinalizableUint8List(resourceUris[i], resourceData)); resources.add(FinalizableUint8List(resourceUris[i], resourceData));
await withVoidCallback((cb) => await withVoidCallback((requestId, cb) =>
GltfResourceLoader_addResourceDataRenderThread( GltfResourceLoader_addResourceDataRenderThread(
gltfResourceLoader, gltfResourceLoader,
resourceUris[i], resourceUris[i],
resourceData.address, resourceData.address,
resourceData.lengthInBytes, resourceData.lengthInBytes,
requestId,
cb)); cb));
} }
@@ -864,8 +868,8 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
SceneAsset_createFromFilamentAssetRenderThread(engine, SceneAsset_createFromFilamentAssetRenderThread(engine,
gltfAssetLoader, nameComponentManager, filamentAsset, cb)); gltfAssetLoader, nameComponentManager, filamentAsset, cb));
await withVoidCallback((cb) => GltfResourceLoader_destroyRenderThread( await withVoidCallback((requestId, cb) => GltfResourceLoader_destroyRenderThread(
engine, gltfResourceLoader, cb)); engine, gltfResourceLoader, requestId, cb));
return FFIAsset(asset, this, animationManager.cast<TAnimationManager>()); return FFIAsset(asset, this, animationManager.cast<TAnimationManager>());
} finally { } finally {
@@ -883,10 +887,10 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
View_setColorGrading(view.view, nullptr); View_setColorGrading(view.view, nullptr);
for (final cg in view.colorGrading.entries) { for (final cg in view.colorGrading.entries) {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_destroyColorGradingRenderThread(engine, cg.value, cb)); (requestId, cb) => Engine_destroyColorGradingRenderThread(engine, cg.value, requestId, cb));
} }
await withVoidCallback( await withVoidCallback(
(cb) => Engine_destroyViewRenderThread(engine, view.view, cb)); (requestId, cb) => Engine_destroyViewRenderThread(engine, view.view, requestId, cb));
for (final swapchain in _swapChains.keys) { for (final swapchain in _swapChains.keys) {
if (_swapChains[swapchain]!.contains(view)) { if (_swapChains[swapchain]!.contains(view)) {
_swapChains[swapchain]!.remove(view); _swapChains[swapchain]!.remove(view);
@@ -898,7 +902,7 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
Future destroyScene(covariant FFIScene scene) async { Future destroyScene(covariant FFIScene scene) async {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_destroySceneRenderThread(engine, scene.scene, cb)); (requestId, cb) => Engine_destroySceneRenderThread(engine, scene.scene, requestId, cb));
} }
Future<Pointer<TColorGrading>> createColorGrading(ToneMapper mapper) async { Future<Pointer<TColorGrading>> createColorGrading(ToneMapper mapper) async {
@@ -1024,10 +1028,10 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
/// ///
Future flush() async { Future flush() async {
if (FILAMENT_SINGLE_THREADED) { if (FILAMENT_SINGLE_THREADED) {
await withVoidCallback((cb) => Engine_executeRenderThread(engine, cb)); await withVoidCallback((requestId, cb) => Engine_executeRenderThread(engine, requestId, cb));
} else { } else {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_flushAndWaitRenderThread(engine, cb)); (requestId, cb) => Engine_flushAndWaitRenderThread(engine, requestId, cb));
} }
} }

View File

@@ -18,8 +18,8 @@ class FFIMaterial extends Material {
} }
Future destroy() async { Future destroy() async {
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Engine_destroyMaterialRenderThread(app.engine, pointer, cb); Engine_destroyMaterialRenderThread(app.engine, pointer, requestId, cb);
}); });
} }
@@ -168,8 +168,8 @@ class FFIMaterialInstance extends MaterialInstance {
} }
Future destroy() async { Future destroy() async {
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Engine_destroyMaterialInstanceRenderThread(app.engine, this.pointer, cb); Engine_destroyMaterialInstanceRenderThread(app.engine, this.pointer, requestId, cb);
}); });
} }

View File

@@ -23,6 +23,6 @@ class FFIRenderTarget extends RenderTarget {
@override @override
Future destroy() async { Future destroy() async {
await withVoidCallback((cb) => RenderTarget_destroyRenderThread(app.engine, renderTarget, cb)); await withVoidCallback((requestId, cb) => RenderTarget_destroyRenderThread(app.engine, renderTarget, requestId, cb));
} }
} }

View File

@@ -30,8 +30,8 @@ class FFITexture extends Texture {
@override @override
Future<void> dispose() async { Future<void> dispose() async {
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Engine_destroyTextureRenderThread(_engine, pointer, cb); Engine_destroyTextureRenderThread(_engine, pointer, requestId,cb);
}); });
} }
@@ -183,8 +183,8 @@ class FFILinearImage extends LinearImage {
} }
Future<void> destroy() async { Future<void> destroy() async {
await withVoidCallback((cb) { await withVoidCallback((requestId, cb) {
Image_destroyRenderThread(this.pointer, cb); Image_destroyRenderThread(this.pointer, requestId, cb);
}); });
} }
@@ -316,8 +316,8 @@ class FFITextureSampler extends TextureSampler {
// } // }
Future<void> setAnisotropy(double anisotropy) async { Future<void> setAnisotropy(double anisotropy) async {
await withVoidCallback((cb) { await withVoidCallback((requestId,cb) {
TextureSampler_setAnisotropyRenderThread(pointer, anisotropy, cb); TextureSampler_setAnisotropyRenderThread(pointer, anisotropy, requestId,cb);
}); });
} }
@@ -334,8 +334,8 @@ class FFITextureSampler extends TextureSampler {
@override @override
Future dispose() async { Future dispose() async {
await withVoidCallback((cb) { await withVoidCallback((requestId,cb) {
TextureSampler_destroyRenderThread(pointer, cb); TextureSampler_destroyRenderThread(pointer, requestId,cb);
}); });
} }
} }

View File

@@ -113,8 +113,8 @@ class FFIView extends View {
@override @override
Future setBloom(bool enabled, double strength) async { Future setBloom(bool enabled, double strength) async {
await withVoidCallback((cb) { await withVoidCallback((requestId,cb) {
View_setBloomRenderThread(view, enabled, strength, cb); View_setBloomRenderThread(view, enabled, strength, requestId,cb);
}); });
} }

View File

@@ -116,14 +116,14 @@ class ThermionViewerFFI extends ThermionViewer {
/// ///
@override @override
Future render() async { Future render() async {
await withVoidCallback((cb) => await withVoidCallback((requestId,cb) =>
RenderTicker_renderRenderThread(app.renderTicker, 0.toBigInt, cb)); RenderTicker_renderRenderThread(app.renderTicker, 0.toBigInt, requestId,cb));
if (FILAMENT_SINGLE_THREADED) { if (FILAMENT_SINGLE_THREADED) {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_executeRenderThread(app.engine, cb)); (requestId,cb) => Engine_executeRenderThread(app.engine, requestId,cb));
} else { } else {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_flushAndWaitRenderThread(app.engine, cb)); (requestId,cb) => Engine_flushAndWaitRenderThread(app.engine, requestId,cb));
} }
} }
@@ -301,7 +301,7 @@ class ThermionViewerFFI extends ThermionViewer {
if (skybox != null) { if (skybox != null) {
await withVoidCallback( await withVoidCallback(
(cb) => Engine_destroySkyboxRenderThread(app.engine, skybox!, cb)); (requestId,cb) => Engine_destroySkyboxRenderThread(app.engine, skybox!, requestId,cb));
skybox = null; skybox = null;
} }
} }
@@ -313,8 +313,8 @@ class ThermionViewerFFI extends ThermionViewer {
Future removeIbl() async { Future removeIbl() async {
if (indirectLight != null) { if (indirectLight != null) {
Scene_setIndirectLight(scene.scene, nullptr); Scene_setIndirectLight(scene.scene, nullptr);
await withVoidCallback((cb) => Engine_destroyIndirectLightRenderThread( await withVoidCallback((requestId,cb) => Engine_destroyIndirectLightRenderThread(
app.engine, indirectLight!, cb)); app.engine, indirectLight!, requestId,cb));
indirectLight = null; indirectLight = null;
} }
} }