From e984d8cf71b8652cc757c2241230342405e97f86 Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Tue, 1 Jul 2025 13:01:39 +0800 Subject: [PATCH] don't pass View to readPixels (only width/height, x/y offsets needed, and optionally rendertarget) --- .../filament/src/implementation/ffi_filament_app.dart | 3 ++- thermion_dart/native/include/c_api/TRenderer.h | 2 +- .../native/include/c_api/ThermionDartRenderThreadApi.h | 2 +- thermion_dart/native/src/c_api/TRenderer.cpp | 9 +++------ .../native/src/c_api/ThermionDartRenderThreadApi.cpp | 4 ++-- 5 files changed, 9 insertions(+), 11 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 06c8f8ff..87535a37 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 @@ -800,10 +800,11 @@ class FFIFilamentApp extends FilamentApp { if (captureRenderTarget && view.renderTarget == null) { throw Exception(); } + await withVoidCallback((requestId, cb) { Renderer_readPixelsRenderThread( renderer, - view.view, + viewport.width, viewport.height, 0, 0, view.renderTarget == null ? nullptr : view.renderTarget!.getNativeHandle(), diff --git a/thermion_dart/native/include/c_api/TRenderer.h b/thermion_dart/native/include/c_api/TRenderer.h index 069ddca3..b491d876 100644 --- a/thermion_dart/native/include/c_api/TRenderer.h +++ b/thermion_dart/native/include/c_api/TRenderer.h @@ -17,7 +17,7 @@ EMSCRIPTEN_KEEPALIVE void Renderer_render(TRenderer *tRenderer, TView *tView); EMSCRIPTEN_KEEPALIVE void Renderer_renderStandaloneView(TRenderer *tRenderer, TView *tView); EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( TRenderer *tRenderer, - TView *tView, + uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset, TRenderTarget *tRenderTarget, TPixelDataFormat tPixelBufferFormat, TPixelDataType tPixelDataType, diff --git a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h index 6a72ed3d..c31e52dd 100644 --- a/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h +++ b/thermion_dart/native/include/c_api/ThermionDartRenderThreadApi.h @@ -79,7 +79,7 @@ namespace thermion void Renderer_renderStandaloneViewRenderThread(TRenderer *tRenderer, TView *tView, uint32_t requestId, VoidCallback onComplete); void Renderer_readPixelsRenderThread( TRenderer *tRenderer, - TView *tView, + uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset, TRenderTarget *tRenderTarget, TPixelDataFormat tPixelBufferFormat, TPixelDataType tPixelDataType, diff --git a/thermion_dart/native/src/c_api/TRenderer.cpp b/thermion_dart/native/src/c_api/TRenderer.cpp index f04fb6ee..24796cdb 100644 --- a/thermion_dart/native/src/c_api/TRenderer.cpp +++ b/thermion_dart/native/src/c_api/TRenderer.cpp @@ -93,7 +93,7 @@ class CaptureCallbackHandler : public filament::backend::CallbackHandler EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( TRenderer *tRenderer, - TView *tView, + uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset, TRenderTarget *tRenderTarget, TPixelDataFormat tPixelBufferFormat, TPixelDataType tPixelDataType, @@ -102,9 +102,6 @@ EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( auto *renderer = reinterpret_cast(tRenderer); auto *renderTarget = reinterpret_cast(tRenderTarget); - auto *view = reinterpret_cast(tView); - - filament::Viewport const &vp = view->getViewport(); filament::backend::PixelDataFormat pixelBufferFormat = static_cast(tPixelBufferFormat); filament::backend::PixelDataType pixelDataType = static_cast(tPixelDataType); @@ -126,9 +123,9 @@ EMSCRIPTEN_KEEPALIVE void Renderer_readPixels( ); if(renderTarget) { - renderer->readPixels(renderTarget, 0, 0, vp.width, vp.height, std::move(pbd)); + renderer->readPixels(renderTarget, xOffset, yOffset, width, height, std::move(pbd)); } else { - renderer->readPixels(0, 0, vp.width, vp.height, std::move(pbd)); + renderer->readPixels(xOffset, yOffset, width, height, std::move(pbd)); } } diff --git a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp index 3ce0a01b..6f00a17e 100644 --- a/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp +++ b/thermion_dart/native/src/c_api/ThermionDartRenderThreadApi.cpp @@ -474,7 +474,7 @@ extern "C" EMSCRIPTEN_KEEPALIVE void Renderer_readPixelsRenderThread( TRenderer *tRenderer, - TView *tView, + uint32_t width, uint32_t height, uint32_t xOffset, uint32_t yOffset, TRenderTarget *tRenderTarget, TPixelDataFormat tPixelBufferFormat, TPixelDataType tPixelDataType, @@ -485,7 +485,7 @@ extern "C" std::packaged_task lambda( [=]() mutable { - Renderer_readPixels(tRenderer, tView, tRenderTarget, tPixelBufferFormat, tPixelDataType, out, outLength); + Renderer_readPixels(tRenderer, width, height, xOffset, yOffset, tRenderTarget, tPixelBufferFormat, tPixelDataType, out, outLength); PROXY(onComplete(requestId)); }); auto fut = _renderThread->add_task(lambda);