Remove sync_usd_on_fabric_write workaround (OMPE-85872 fixed in Kit 110.1)#5356
Remove sync_usd_on_fabric_write workaround (OMPE-85872 fixed in Kit 110.1)#5356pv-nvidia wants to merge 1 commit intoisaac-sim:developfrom
Conversation
With the Kit PrepareForReuse fix (OMPE-85872), the RTX renderer now properly picks up GPU-resident Fabric transforms via the MGpu ReadWrite path. The old sync_usd_on_fabric_write workaround that double-wrote every Fabric pose change back to USD is no longer needed. Changes: - Remove sync_usd_on_fabric_write parameter from XformPrimView - Remove USD mirror writes from _set_world_poses_fabric and _set_scales_fabric - Remove the save/restore of sync flag in _sync_fabric_from_usd_once - Remove sync_usd_on_fabric_write=True from Camera sensor (the TODO) - Add test_fabric_writes_do_not_sync_to_usd to verify Fabric writes remain GPU-resident and do not modify USD xformOp attributes This eliminates the performance penalty of double-writing transforms for cameras and any other prims that previously required the workaround.
There was a problem hiding this comment.
🤖 Isaac Lab Review Bot
Summary
This PR removes the sync_usd_on_fabric_write workaround from XformPrimView now that the Kit 110.1 PrepareForReuse fix (OMPE-85872) properly dirties Fabric attributes for GPU renderers. The implementation is clean and focused.
Architecture Impact
The blast radius is contained:
- Only Camera sensor was using
sync_usd_on_fabric_write=Trueinternally - No external code in the repo passes this parameter (confirmed via code search)
- The
XformPrimViewAPI change removes a parameter that defaulted toFalse, so existing callers are unaffected
Consumers found:
camera.py✅ (updated in this PR)tiled_camera.py(does not use the removed parameter)ray_caster.py,multi_mesh_ray_caster.py,ray_cast_utils.py(do not use it)interactive_scene.py(does not use it)- Benchmark scripts (do not use it)
Implementation Verdict
Ship it — Clean removal of dead code with proper regression test.
Test Coverage
✅ Excellent test coverage:
- New
test_fabric_writes_do_not_sync_to_usddirectly validates the behavioral change (Fabric writes do NOT sync to USD) - Test verifies both position (
xformOp:translate) and orientation (xformOp:orient) isolation - Test covers both
cpuandcudadevices via parametrization - The test properly:
- Sets up Camera prims with known USD positions
- Writes different values via Fabric
- Confirms Fabric reads return new values
- Confirms USD attributes retain original values
- Existing tests continue to pass (they never used
sync_usd_on_fabric_write=True)
CI Status
✅ All checks passing (only labeler check ran for this branch configuration)
Findings
No issues found. The changes are surgical and correct:
🟢 Clean API removal: The sync_usd_on_fabric_write parameter and self._sync_usd_on_fabric_write field are fully removed from XformPrimView
🟢 Correct Camera update: The only caller using sync_usd_on_fabric_write=True (camera.py) now uses the simplified API
🟢 Docstring updated: The class docstring now correctly states "Fabric writes remain GPU-resident and are not mirrored back to USD"
🟢 _sync_fabric_from_usd_once simplified: No longer needs to save/restore the sync flag since it is gone
Minor Notes (not blocking)
- CHANGELOG.rst: No changelog entry for the breaking API change. Since the removed parameter defaulted to
False, external impact is minimal, but documenting it helps users upgrading. - Kit version requirement: The PR description mentions "Requires Kit 110.1+" — consider adding this to docstrings or version checks if not already enforced elsewhere.
Summary
Removes the
sync_usd_on_fabric_writeworkaround fromXformPrimViewand the Camera sensor. This double-write hack is no longer needed now that the KitPrepareForReusefix properly dirties Fabric attributes for the GPU renderer.Background
When
XformPrimViewwrites transforms to Fabric viaSelectPrims+ Warp kernels, the data is GPU-resident onomni:fabric:worldMatrix. Prior to the Kit 110.1 fix, the RTX renderer did not pick up these GPU-resident changes because Fabric didn't signal attribute dirtiness at the device level (OMPE-85872).The workaround was
sync_usd_on_fabric_write=True, which mirrored every Fabric pose write back to USD — effectively double-writing transforms (GPU Fabric + CPU USD). This defeated the performance benefit of Fabric for any prim that needed to be visible to the renderer (e.g., cameras).The
PrepareForReusefix in Kit 110.1 resolves this at the Fabric level usingdirtyAttribute(CPU) andgetAttributeArrayMGpu/getArrayAttributeArrayWithSizesMGpu(GPU) to properly signal changes to downstream consumers.Changes
source/isaaclab/isaaclab/sim/views/xform_prim_view.pysync_usd_on_fabric_writeconstructor parameterself._sync_usd_on_fabric_writefield_set_world_poses_fabric()and_set_scales_fabric()_sync_fabric_from_usd_once()(no more save/restore of sync flag)source/isaaclab/isaaclab/sensors/camera/camera.pysync_usd_on_fabric_write=Trueand the associated TODO commentsource/isaaclab/test/sim/test_views_xform_prim.pytest_fabric_writes_do_not_sync_to_usdregression test: writes via Fabric, then verifies USDxformOp:translateandxformOp:orientstill hold their original valuesImpact
sync_usd_on_fabric_write=True)sync_usd_on_fabric_writeparameter fromXformPrimView.__init__(). This is a breaking change for any external code passing this argument, but it defaulted toFalseso only the internal Camera sensor was affected.PrepareForReusecross-device fixTest Plan
test_views_xform_prim.pytests pass (they never setsync_usd_on_fabric_write=True)test_fabric_writes_do_not_sync_to_usdvalidates Fabric/USD isolation