From c7d4d9cb3386d12cc28016b40b64e45786ddc397 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 24 Jun 2025 10:35:33 +0800 Subject: [PATCH] add NativeHandle interface and refactor SwapChain to use getNativeHandle --- .../src/implementation/ffi_filament_app.dart | 17 ++++++++++++----- .../src/implementation/ffi_swapchain.dart | 10 +++++++--- .../filament/src/interface/native_handle.dart | 11 +++++++++++ .../src/filament/src/interface/swap_chain.dart | 4 +++- 4 files changed, 33 insertions(+), 9 deletions(-) create mode 100644 thermion_dart/lib/src/filament/src/interface/native_handle.dart diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart index 7d74d7d9..c15ff593 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_filament_app.dart @@ -145,7 +145,7 @@ class FFIFilamentApp extends FilamentApp { } } RenderTicker_setRenderable( - renderTicker, swapChain.swapChain, viewsPtr, numRenderable); + renderTicker, swapChain.getNativeHandle(), viewsPtr, numRenderable); _logger.info("Updated render order, $numRenderable renderable views"); } } @@ -223,7 +223,7 @@ class FFIFilamentApp extends FilamentApp { _logger.info("Destroying swapchain"); await withVoidCallback((requestId, callback) { Engine_destroySwapChainRenderThread( - engine, (swapChain as FFISwapChain).swapChain, requestId, callback); + engine, swapChain.getNativeHandle(), requestId, callback); }); _swapChains.remove(swapChain); _logger.info("Destroyed swapchain"); @@ -575,7 +575,7 @@ class FFIFilamentApp extends FilamentApp { final view = _swapChains[swapchain]!.first; await withBoolCallback((cb) { Renderer_beginFrameRenderThread( - renderer, swapchain.swapChain, 0.toBigInt, cb); + renderer, swapchain.getNativeHandle(), 0.toBigInt, cb); }); await withVoidCallback((requestId, cb) { Renderer_renderRenderThread( @@ -622,6 +622,13 @@ class FFIFilamentApp extends FilamentApp { await updateRenderOrder(); } + /// + /// + /// + Future> getSwapChains() async { + return _swapChains.keys; + } + final _hooks = []; /// @@ -756,7 +763,7 @@ class FFIFilamentApp extends FilamentApp { final beginFrame = await withBoolCallback((cb) { Renderer_beginFrameRenderThread( - renderer, swapChain!.swapChain, 0.toBigInt, cb); + renderer, swapChain!.getNativeHandle(), 0.toBigInt, cb); }); final pixelBuffers = <(View, Uint8List)>[]; @@ -838,7 +845,7 @@ class FFIFilamentApp extends FilamentApp { // synchronous, so we'll add a ~2 frame delay to wait for this to be available. if (FILAMENT_SINGLE_THREADED) { await withBoolCallback((cb) => Renderer_beginFrameRenderThread( - renderer, swapChain!.swapChain, 0.toBigInt, cb)); + renderer, swapChain!.getNativeHandle(), 0.toBigInt, cb)); for (final view in views) { await withVoidCallback((requestId, cb) { Renderer_renderRenderThread( diff --git a/thermion_dart/lib/src/filament/src/implementation/ffi_swapchain.dart b/thermion_dart/lib/src/filament/src/implementation/ffi_swapchain.dart index 9b57c7f5..0096978f 100644 --- a/thermion_dart/lib/src/filament/src/implementation/ffi_swapchain.dart +++ b/thermion_dart/lib/src/filament/src/implementation/ffi_swapchain.dart @@ -1,7 +1,11 @@ import 'package:thermion_dart/thermion_dart.dart'; -class FFISwapChain extends SwapChain { - final Pointer swapChain; +class FFISwapChain extends SwapChain { + + final Pointer pointer; - FFISwapChain(this.swapChain); + T getNativeHandle() => pointer as T; + + FFISwapChain(this.pointer); + } diff --git a/thermion_dart/lib/src/filament/src/interface/native_handle.dart b/thermion_dart/lib/src/filament/src/interface/native_handle.dart new file mode 100644 index 00000000..0bb975fe --- /dev/null +++ b/thermion_dart/lib/src/filament/src/interface/native_handle.dart @@ -0,0 +1,11 @@ +/// A top-level interface for any object that need to be passed +/// across "native" boundaries (either via FFI or Javascript interop). +/// +/// Currently, [T] must always be a [Pointer] (which is defined and implemented +/// differently depending on the target platform). However, T is unbounded so +/// this is never checked at compile-time (so getNativeHandle() is +/// not a compile-time error). +/// +abstract class NativeHandle { + T getNativeHandle(); +} diff --git a/thermion_dart/lib/src/filament/src/interface/swap_chain.dart b/thermion_dart/lib/src/filament/src/interface/swap_chain.dart index e15393c3..faac0616 100644 --- a/thermion_dart/lib/src/filament/src/interface/swap_chain.dart +++ b/thermion_dart/lib/src/filament/src/interface/swap_chain.dart @@ -1,3 +1,5 @@ -abstract class SwapChain { +import 'native_handle.dart'; + +abstract class SwapChain extends NativeHandle { }