mgpuReadAsyncFloat function

Future<void> mgpuReadAsyncFloat(
  1. MGPUBuffer buffer,
  2. Float32List outputData, {
  3. int readElements = 0,
  4. 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);
  }
}