mgpuReadAsyncFloat function
Future<void>
mgpuReadAsyncFloat(
- MGPUBuffer buffer,
- Float32List outputData, {
- int readElements = 0,
- int elementOffset = 0,
Implementation
Future<void> mgpuReadAsyncFloat(
MGPUBuffer buffer,
Float32List outputData, {
int readElements = 0,
int elementOffset = 0,
}) async {
final int bytesPerElem = Float32List.bytesPerElement;
final int elementsToRead = (readElements > 0)
? readElements
: (outputData.length - elementOffset);
final int sizeToAllocate = elementsToRead * bytesPerElem;
if (elementsToRead <= 0 ||
elementOffset < 0 ||
elementOffset >= outputData.length)
return;
final JSNumber ptr = _malloc((sizeToAllocate + 64).toJS);
final int startByteIndex = ptr.toDartInt; // This is correct - byte index
final int startElementIndex =
startByteIndex ~/ bytesPerElem; // Convert to element index
try {
// Add bounds check for the heap access using ELEMENT indices
if (startElementIndex < 0 ||
startElementIndex + elementsToRead > _heapF32.length) {
throw StateError(
'Float32 buffer read would exceed heap bounds: '
'trying to read $elementsToRead elements at element index $startElementIndex '
'but heap size is ${_heapF32.length}',
);
}
await ccall(
"mgpuReadSyncFloat32".toJS,
"void".toJS,
["number", "number", "number", "number"].toJSDeep,
[buffer, ptr, elementsToRead.toJS, elementOffset.toJS].toJSDeep,
{"async": true}.toJSDeep,
).toDart;
// Use the ELEMENT index for the typed array access
final output = _heapF32.sublist(
startElementIndex,
startElementIndex + elementsToRead,
);
outputData.setAll(elementOffset, output);
} finally {
_free(ptr);
}
}