From a31f11151e255f751c6fa450f24db0fe825cd35b Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 22 May 2025 15:19:03 +0800 Subject: [PATCH] check for beginFrame returning false in project() and correctly calculate numChannels/channelSize --- .../src/implementation/ffi_filament_app.dart | 109 ++++++++++-------- 1 file changed, 62 insertions(+), 47 deletions(-) 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 f3732266..b04585be 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 @@ -710,69 +710,84 @@ class FFIFilamentApp extends FilamentApp { } await updateRenderOrder(); - await withBoolCallback((cb) { + final beginFrame = await withBoolCallback((cb) { Renderer_beginFrameRenderThread( renderer, swapChain!.swapChain, 0.toBigInt, cb); }); - final views = []; - if (view != null) { - views.add(view); - } else { - views.addAll(_swapChains[swapChain]!); - } final pixelBuffers = <(View, Uint8List)>[]; - for (final view in views) { - beforeRender?.call(view); - - final viewport = await view.getViewport(); - final pixelBuffer = - Uint8List(viewport.width * viewport.height * 4 * sizeOf()); - await withVoidCallback((requestId, cb) { - Renderer_renderRenderThread( - renderer, - view.view, - requestId, - cb, - ); - }); - - if (captureRenderTarget && view.renderTarget == null) { - throw Exception(); + if (beginFrame) { + final views = []; + if (view != null) { + views.add(view); + } else { + views.addAll(_swapChains[swapChain]!.where((v) => v.renderable)); } - await withVoidCallback((requestId, cb) { - Renderer_readPixelsRenderThread( + + _logger.info("Capturing ${views.length} views"); + + for (final view in views) { + beforeRender?.call(view); + + final viewport = await view.getViewport(); + + int numChannels = switch (pixelDataFormat) { + PixelDataFormat.RGBA => 4, + PixelDataFormat.RGB => 3, + _ => throw UnsupportedError(pixelDataFormat.toString()) + }; + + int channelSizeInBytes = switch (pixelDataType) { + PixelDataType.FLOAT => sizeOf(), + PixelDataType.UBYTE || PixelDataType.BYTE => 1, + _ => throw UnsupportedError(pixelDataFormat.toString()) + }; + final pixelBuffer = Uint8List(viewport.width * + viewport.height * + numChannels * + channelSizeInBytes); + await withVoidCallback((requestId, cb) { + Renderer_renderRenderThread( renderer, view.view, - view.renderTarget == null - ? nullptr - : view.renderTarget!.renderTarget, - // TPixelDataFormat.PIXELDATAFORMAT_RGBA, - // TPixelDataType.PIXELDATATYPE_UBYTE, - // TPixelDataFormat.fromValue(pixelDataFormat.value), - // TPixelDataType.fromValue(pixelDataType.value), - pixelDataFormat.value, - pixelDataType.value, - pixelBuffer.address, - pixelBuffer.length, requestId, - cb); - }); - pixelBuffers.add((view, pixelBuffer)); + cb, + ); + }); + + if (captureRenderTarget && view.renderTarget == null) { + throw Exception(); + } + await withVoidCallback((requestId, cb) { + Renderer_readPixelsRenderThread( + renderer, + view.view, + view.renderTarget == null + ? nullptr + : view.renderTarget!.renderTarget, + // TPixelDataFormat.PIXELDATAFORMAT_RGBA, + // TPixelDataType.PIXELDATATYPE_UBYTE, + // TPixelDataFormat.fromValue(pixelDataFormat.value), + // TPixelDataType.fromValue(pixelDataType.value), + pixelDataFormat.value, + pixelDataType.value, + pixelBuffer.address, + pixelBuffer.length, + requestId, + cb); + }); + pixelBuffers.add((view, pixelBuffer)); + } + } else { + _logger.severe("beginFrame returned false"); } await withVoidCallback((requestId, cb) { Renderer_endFrameRenderThread(renderer, requestId, cb); }); - await withVoidCallback((requestId, cb) { - if (FILAMENT_SINGLE_THREADED) { - Engine_executeRenderThread(engine, requestId, cb); - } else { - Engine_flushAndWaitRenderThread(engine, requestId, cb); - } - }); + await flush(); return pixelBuffers; }