don't require SwapChain to be passed to viewer.render - this will just render into all registered swapchains

This commit is contained in:
Nick Fisher
2025-06-24 10:36:10 +08:00
parent c7d4d9cb33
commit d20ff0a6f1
4 changed files with 33 additions and 33 deletions

View File

@@ -203,8 +203,8 @@ abstract class FilamentApp<T> {
///
///
///
Future setMaterialInstanceAt(
ThermionEntity entity, int primitiveIndex, MaterialInstance materialInstance);
Future setMaterialInstanceAt(ThermionEntity entity, int primitiveIndex,
MaterialInstance materialInstance);
///
///
@@ -216,6 +216,11 @@ abstract class FilamentApp<T> {
///
Future unregister(covariant SwapChain swapChain, covariant View view);
///
///
///
Future<Iterable<SwapChain>> getSwapChains();
///
///
///

View File

@@ -123,25 +123,29 @@ class ThermionViewerFFI extends ThermionViewer {
///
///
@override
Future render(SwapChain swapchain) async {
await withBoolCallback(
(cb) => Renderer_beginFrameRenderThread(
app.renderer,
(swapchain as FFISwapChain).swapChain,
0.toBigInt,
cb,
),
);
Future render() async {
final swapChains =
await (FilamentApp.instance as FFIFilamentApp).getSwapChains();
for (final swapChain in swapChains) {
await withBoolCallback(
(cb) => Renderer_beginFrameRenderThread(
app.renderer,
swapChain.getNativeHandle(),
0.toBigInt,
cb,
),
);
await withVoidCallback(
(requestId, cb) =>
Renderer_renderRenderThread(app.renderer, view.view, requestId, cb),
);
await withVoidCallback(
(requestId, cb) =>
Renderer_endFrameRenderThread(app.renderer, requestId, cb),
);
await FilamentApp.instance!.flush();
await withVoidCallback(
(requestId, cb) =>
Renderer_renderRenderThread(app.renderer, view.view, requestId, cb),
);
await withVoidCallback(
(requestId, cb) =>
Renderer_endFrameRenderThread(app.renderer, requestId, cb),
);
await FilamentApp.instance!.flush();
}
}
double _msPerFrame = 1000.0 / 60.0;

View File

@@ -39,9 +39,9 @@ abstract class ThermionViewer {
Future setRendering(bool render);
///
/// Render a single frame immediately.
/// Render a single frame immediately into all registered swapchains.
///
Future render(SwapChain swapChain);
Future render();
///
///

View File

@@ -13,20 +13,11 @@ void main() async {
test("request frame on render thread", () async {
await testHelper.withViewer((viewer) async {
await viewer.render();
await Future.delayed(Duration(milliseconds: 1));
// var data = viewer.metalTexture.getTextureBytes()!;
// var pixels = data.bytes.cast<Uint8>().asTypedList(data.length);
// savePixelBufferToBmp(
// pixels, 500, 500, "${testHelper.testDir}/request_frame.bmp");
await Future.delayed(Duration(seconds: 1));
await viewer.setRendering(true);
await Future.delayed(Duration(seconds: 1));
await FilamentApp.instance!.requestFrame();
await testHelper.capture(viewer.view, "render_thread_2");
});
}, addSkybox: true);
});
}