check for beginFrame returning false in project() and correctly calculate numChannels/channelSize
This commit is contained in:
@@ -710,25 +710,43 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
|
|||||||
}
|
}
|
||||||
await updateRenderOrder();
|
await updateRenderOrder();
|
||||||
|
|
||||||
await withBoolCallback((cb) {
|
final beginFrame = await withBoolCallback((cb) {
|
||||||
Renderer_beginFrameRenderThread(
|
Renderer_beginFrameRenderThread(
|
||||||
renderer, swapChain!.swapChain, 0.toBigInt, cb);
|
renderer, swapChain!.swapChain, 0.toBigInt, cb);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final pixelBuffers = <(View, Uint8List)>[];
|
||||||
|
|
||||||
|
if (beginFrame) {
|
||||||
final views = <FFIView>[];
|
final views = <FFIView>[];
|
||||||
if (view != null) {
|
if (view != null) {
|
||||||
views.add(view);
|
views.add(view);
|
||||||
} else {
|
} else {
|
||||||
views.addAll(_swapChains[swapChain]!);
|
views.addAll(_swapChains[swapChain]!.where((v) => v.renderable));
|
||||||
}
|
}
|
||||||
|
|
||||||
final pixelBuffers = <(View, Uint8List)>[];
|
_logger.info("Capturing ${views.length} views");
|
||||||
|
|
||||||
for (final view in views) {
|
for (final view in views) {
|
||||||
beforeRender?.call(view);
|
beforeRender?.call(view);
|
||||||
|
|
||||||
final viewport = await view.getViewport();
|
final viewport = await view.getViewport();
|
||||||
final pixelBuffer =
|
|
||||||
Uint8List(viewport.width * viewport.height * 4 * sizeOf<Float>());
|
int numChannels = switch (pixelDataFormat) {
|
||||||
|
PixelDataFormat.RGBA => 4,
|
||||||
|
PixelDataFormat.RGB => 3,
|
||||||
|
_ => throw UnsupportedError(pixelDataFormat.toString())
|
||||||
|
};
|
||||||
|
|
||||||
|
int channelSizeInBytes = switch (pixelDataType) {
|
||||||
|
PixelDataType.FLOAT => sizeOf<Float>(),
|
||||||
|
PixelDataType.UBYTE || PixelDataType.BYTE => 1,
|
||||||
|
_ => throw UnsupportedError(pixelDataFormat.toString())
|
||||||
|
};
|
||||||
|
final pixelBuffer = Uint8List(viewport.width *
|
||||||
|
viewport.height *
|
||||||
|
numChannels *
|
||||||
|
channelSizeInBytes);
|
||||||
await withVoidCallback((requestId, cb) {
|
await withVoidCallback((requestId, cb) {
|
||||||
Renderer_renderRenderThread(
|
Renderer_renderRenderThread(
|
||||||
renderer,
|
renderer,
|
||||||
@@ -761,18 +779,15 @@ class FFIFilamentApp extends FilamentApp<Pointer> {
|
|||||||
});
|
});
|
||||||
pixelBuffers.add((view, pixelBuffer));
|
pixelBuffers.add((view, pixelBuffer));
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
_logger.severe("beginFrame returned false");
|
||||||
|
}
|
||||||
|
|
||||||
await withVoidCallback((requestId, cb) {
|
await withVoidCallback((requestId, cb) {
|
||||||
Renderer_endFrameRenderThread(renderer, requestId, cb);
|
Renderer_endFrameRenderThread(renderer, requestId, cb);
|
||||||
});
|
});
|
||||||
|
|
||||||
await withVoidCallback((requestId, cb) {
|
await flush();
|
||||||
if (FILAMENT_SINGLE_THREADED) {
|
|
||||||
Engine_executeRenderThread(engine, requestId, cb);
|
|
||||||
} else {
|
|
||||||
Engine_flushAndWaitRenderThread(engine, requestId, cb);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return pixelBuffers;
|
return pixelBuffers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user