Fix OVRTX GPU transform default#6626
Conversation
Default OVRTX to the safe CPU transform-read path while preserving an explicit environment-variable opt-in for validated GPU workloads. Refs isaac-sim#6625
Standalone reproducer and captured outputThe complete reproducer is published at an immutable commit:
It can be run directly from that folder: python repro.py --num-envs 4 --steps 5000 --seed 17
# Automated fresh-process trial
python repro.py --headless --steps 1000 --stop-on-failureThe repository contains the robot asset and does not import GalbotLab. Four environments receive identical robot and camera states; the detector compares persistent denoised silhouettes and only reports a rendering failure while Newton state is finite and synchronized. The entry point supports both the stable and current
The captured failure affected environment 1 with 399 differing silhouette pixels (352 persistent across the three-frame confirmation window, maximum RGB channel error 211). USD visibility remained unchanged; the exact camera poses, body/joint state, package versions, and detection values are included in Newton visualizer framebuffer from the same capture: Fix validation on current
|
Greptile SummaryThis PR changes the default for OVRTX's
Confidence Score: 5/5Safe to merge — the change is a one-line default flip with a well-tested escape hatch preserved via env var. The fix is narrowly scoped to a single default value in a helper function. The CPU read path was already a supported, tested code branch; only the default changes. Two new contract tests directly cover the new default and the opt-in path, and the existing test suite still passes. The env-var override ensures no workloads are permanently broken by the new default. No files require special attention. Important Files Changed
Sequence Diagram%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
participant Env as Environment Variable ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS
participant Fn as _read_gpu_transforms_enabled()
participant Init as OVRTXRenderer.__init__
participant RC as RendererConfig
participant R as ovrtx.Renderer
Init->>Fn: call at construction time
Fn->>Env: os.environ.get(key, "0")
alt env var unset (default)
Env-->>Fn: "0"
Fn-->>Init: False (CPU path)
else "env var = "1" (opt-in)"
Env-->>Fn: "1"
Fn-->>Init: True (GPU path)
else env var invalid
Fn-->>Init: raises ValueError
end
Init->>RC: "RendererConfig(read_gpu_transforms=False/True)"
RC->>R: Renderer(config)
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
participant Env as Environment Variable ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS
participant Fn as _read_gpu_transforms_enabled()
participant Init as OVRTXRenderer.__init__
participant RC as RendererConfig
participant R as ovrtx.Renderer
Init->>Fn: call at construction time
Fn->>Env: os.environ.get(key, "0")
alt env var unset (default)
Env-->>Fn: "0"
Fn-->>Init: False (CPU path)
else "env var = "1" (opt-in)"
Env-->>Fn: "1"
Fn-->>Init: True (GPU path)
else env var invalid
Fn-->>Init: raises ValueError
end
Init->>RC: "RendererConfig(read_gpu_transforms=False/True)"
RC->>R: Renderer(config)
Reviews (1): Last reviewed commit: "Fix OVRTX GPU transform default" | Re-trigger Greptile |
pbarejko
left a comment
There was a problem hiding this comment.
Hi, thank you for the PR.
I wouldn't merge this change. Unfortunately, I am sad to say, this doesn't fix anything. The problem is upstream - Fabric. This PR hides the symptom and puts Isaac Lab on very slow code path - it would have huge performance implications. My best recommendation is to use ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS=0 in your local workflow.
This is a known issue that has been reported upstream and we should have fix for this.
@mataylor-nvidia can you check:
- Rayyan's fix in Fabric is available in ovrtx-0.4 release? If it is this would confirm if there another hiding bug somewhere and we would have to file another nvbug with provided repro steps.
- If it's not, I know you have built Rayyan's branch, can you use it to validate that it fixes @ruziniuuuuu problem without flipping
read_gpu_transforms?
|
I retested Environment variable only: links still disappear
I then added a small local backport so that Environment variable with backport: links remain complete
With the backport, 3 independent 1,000-step runs completed with |
Good you have a workaround! In long term we will fix the problem upstream in OvRTX and you wouldn't have to manipulate read-gpu-transforms variable. This problem should be addressed in next release of ovrtx-0.5. |
|
Hi @ruziniuuuuu, we have verified upstream fix for this issue: #6625 (comment) Therefore I am taking the liberty and closing this PR since this is not applicable solution. |







Description
Default OVRTX's environment-controlled
read_gpu_transformssetting to the safe CPU-read path. OVRTX warns that enabling Fabric transform reads together with geometry streaming can prevent dynamic geometry from streaming correctly; in Newton workloads this intermittently appears as missing robot links in OVRTX camera output.The existing
ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS=1override remains available as an explicit opt-in for workloads that have validated the previous GPU path. No dependency changes are required.A standalone four-environment differential reproducer found:
The Newton viewer-disabled control reproduced 0 / 3 times. USD visibility stayed unchanged and Newton body/joint states stayed finite and synchronized during captured failures.
Fixes #6625
Type of change
Screenshots
Not applicable to the adapter default itself. Issue #6625 describes the captured missing-link evidence and standalone reproducer.
Validation
pytest source/isaaclab_ov/test/test_ovrtx_renderer_contract.py -q: 14 passed../isaaclab.sh -p tools/changelog/cli.py check develop: passed../isaaclab.sh -f: passed before commit and again before push.Current-
developend-to-end validation used its exact Newton pin (newton 1.4.0.dev0,warp-lang 1.15.0.dev20260626) with OVRTX 0.3: the standalone Newton-viewer MRE completed 1,000 steps across four environments withreproduced=False, finite/synchronized state, and no unsafe transform/geometry-streaming warning. A separate RTX/MDL shutdown segfault occurred only after the result and final capture were written.Risk
The CPU transform-read path may have different renderer performance characteristics. Explicit opt-in to the previous behavior is preserved with
ISAAC_LAB_OVRTX_READ_GPU_TRANSFORMS=1.Checklist
pre-commitchecks with./isaaclab.sh --formatsource/<pkg>/changelog.d/for every touched packageCONTRIBUTORS.mdor my name already exists there