Skip to content

Comments

Fix WASM Output Parameters for JS TypedArrays#3100

Open
Adityakk9031 wants to merge 1 commit intogoogle-deepmind:mainfrom
Adityakk9031:#3067
Open

Fix WASM Output Parameters for JS TypedArrays#3100
Adityakk9031 wants to merge 1 commit intogoogle-deepmind:mainfrom
Adityakk9031:#3067

Conversation

@Adityakk9031
Copy link

Fixes #3067

Issue
In the WASM bindings, functions that take a JS TypedArray as an output parameter (like
mj_contactForce
,
mj_jac
, etc.) fail to write data back to the array.

This happens because
unpack.h
was interpreting byteOffset of a JS TypedArray as a raw WASM memory pointer. For user-created TypedArrays (which are not views into the WASM heap), byteOffset is just an offset within a JS ArrayBuffer (often 0), leading to writes to invalid memory addresses instead of the JS array.

Solution
Implemented a Copy-In / Copy-Out mechanism for JS TypedArrays in
unpack.h
:

Copy-In: When a JS TypedArray is passed, its data is copied into a temporary C++ std::vector (using convertJSArrayToNumberVector).
Reference Tracking: A reference to the original JS object is stored in UnpackedParam::source_val_.
Copy-Out: Added a
writeBack()
method to
UnpackedParam
. When called, it copies the data from the temporary C++ vector back into the original JS TypedArray using TypedArray.set().
Binding Update: Updated
mj_contactForce_wrapper
to call
writeBack()
after the underlying C function returns.
Changes
wasm/unpack.h
:
Added source_val_ member to
UnpackedParam
.
Updated
FromValue
to handle JS TypedArrays by copying data and storing the reference.
Added
writeBack()
method to sync data back to JS.
wasm/codegen/generated/bindings.cc
:
Added result_.writeBack() to
mj_contactForce_wrapper
.

@Adityakk9031
Copy link
Author

@btaba please look into this pr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

mujoco.mj_contactForce in mujoco-js / WASM doesn't seem to do anything

1 participant