USD WebAssembly: Productization List

Goal

Itemize list of low-hanging fruits, tasks and operations to lower the cost of maintaining the USD WebAssembly prototype, and to eventually merge back components into the main USD branch.

Intent:

  • Prevent WebAssembly prototype from lagging too far behind most recent USD version

  • Automate builds, publishing to NPM, Wasmer or other repositories to facilitate integrations and adoption by other parties.

  • Facilitate contributions and collaboration with other parties not necessarily intricately familiar with USD (web community, ThreeJS, etc.)

Itemized list

Items in this list are ordered by ascending order of priority for the WebAssembly project (i.e. from "mandatory" to "optional").

Prerequisite work

Target a recent, stable version of the USD main branch. At the time of writing, USD 23.11 is the branched version.

Action Items:

  • Autodesk to open a branch from OpenUSD 23.11 to make WebAssembly contributions available

  • Autodesk to consider options for overlaps in configurations/platforms between platforms, ongoing Proposals, architectures, etc.

High-level prioritized item list

Item

Notes

Status

Scope

Volunteer

Item

Notes

Status

Scope

Volunteer

0. Legal requirements









Clarify ASWF vs. USD contribution guidelines regarding attributions.

Submit contribution scope/intent to USD Proposals.







1. Build system changes









Add Dockerfile to standardize Emscripten build (using an Ubunutu 22.04 LTS base image)

  •  

    • Using known good Emscripten version (2.0.24)

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/Dockerfile

Done?



Aura

Update build_usd.py build script to support:

Integrate a working prototype of the OpenUSD build script for Emscripten, WasmTBB, build switches, etc.

Done?

Will need additional review, polishing before a final "productization" option is ready.

Phil, (Aura)

Adding an --emscripten build option to specify a WebAssembly target

Potential to replace "–-emscripten" with "–-wasm"? Decision TBD.

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/build_scripts/build_usd.py#L2198

Done?





Using emcmake/emmake as a drop-in replacement for cmake when targeting WebAssembly build

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/build_scripts/build_usd.py#L442

Done?





Replacing TBB with WasmTBB

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/build_scripts/build_usd.py#L956C1-L956C19

Done?





Listing USD components incompatible with WebAssembly build to warn Users that Python, usdview, imaging have been disabled

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/build_scripts/build_usd.py#L2588

Done?





Add CMakeLists.txt for JavaScript/WebAssembly bindings in order to:

  •  

    • List USD binding dependencies (usd, usdLux, usdGeom, usdUtils, sdf, tf)

    • Specify location of WebAssembly build artifacts (WASM bundle, WebWorker, JavaScript bindings)









Include tests to validate WebAssembly build, using a NodeJS dependency in order to enable tests from headless environments. Test examples include (but are not limited to):

  1.  

    1. Loading a USDA stage

    2. Exporting USDA stage to string

    3. Traversing the USDA stage

    4. Running WebWorkers

    5. etc.

https://github.com/autodesk-forks/USD/tree/adsk/feature/webgpu/js/__tests__

Done?





2. Core USD changes









arch library

  • Add #if defined(__EMSCRIPTEN__) guards to integrate Emscripten as an alternative to Linux platform:







Phil, +

pxr/base/arch/debugger.cpp

  •  

    • ArchDebuggerTrap()

    •  ArchAbort()

    •  ARCH_BITS_32

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/debugger.cpp#L597

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/debugger.cpp#L646

Note sure what to do with ARCH_BITS_32

Done?





pxr/base/arch/fileSystem.cpp

  •  

    • ArchStatIsWritable()

    • ArchGetModificationTime()

    • ArchGetAccessTime()

    • ArchGetStatusChangeTime()

    • ArchGetFileLength()

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/fileSystem.cpp#L162

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/fileSystem.cpp#L199

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/fileSystem.cpp#L456

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/fileSystem.cpp#L469

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/fileSystem.cpp#L501

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/debugger.cpp#L660

Done?





pxr/base/arch/library.cpp

  • ArchLibraryOpen()

  •  ArchLibraryError()

  • ArchLibraryClose()

  • ArchLibraryGetSymbolAddress()



Necessary? 





  • ArchGetStartTickTime()

  •  ArchGetStopTickTime()

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/timing.h#L76

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/base/arch/timing.h#L133

Done?





Include tests for the arch library using NodeJS

  • Consider options for running tests in a NodeJS runtime

  • Include a few JavaScript tests demonstrating running tests of the arch lib built from Emscripten

Milestone: Share the code changes made up to this point with the greater USD community, seek feedback, framed around the changes up to this point as early end-to-end demo.





Phil, +











tf library

  • Add type registration for USD symbols to be exposed to/from C++/JavaScript

    • Used to wrap TfToken, double, int, etc.

  • Add TfPointerAndBits to specify operations on 32-bit architectures (as USD only specifies 64-bit operations by default)









vt library

  • Add type registration for USD symbols to be exposed to/from C++/JavaScript

    • Add getJsObj to VtValue (similar to the existing getPyObj for Python)









sdf library

  • Add type registration for USD symbols to be exposed to/from C++/JavaScript

    • Used to wrap SdfPath objects

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/usd/sdf/wrapPathJs.h

Done?





usd library

  • Add type registration for USD symbols to be exposed to/from C++/JavaScript

    • Used to wrap UsdPrim, UsdStage objects to expose CreateNew(), ExportToString() and other API bindings.

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/usd/usd/wrapStageJs.cpp#L105

Done?





3. ThreeJS Hydra renderer









TBD: Separate project/branch? Engage with ThreeJS/web community for collaboration opportunity on this aspect?

https://github.com/autodesk-forks/USD/blob/adsk/feature/webgpu/pxr/usdImaging/hdEmscripten/js/ThreeJsRenderDelegate.js

Done?







License: CC BY 4.0, Copyright Contributors to the ASWF USD working group.