fix: add missing viewport.window + hydra_texture deps for headless rendering#5375
fix: add missing viewport.window + hydra_texture deps for headless rendering#5375pv-nvidia wants to merge 1 commit into
Conversation
…ndering The headless rendering experience file (isaaclab.python.headless.rendering.kit) was missing two extensions required for the annotator/render-product pipeline to function in environments without a display (e.g. DGX Cloud, CI containers): - omni.kit.viewport.window: provides viewport infrastructure needed by rep.create.render_product_tiled() to create render products headlessly. - omni.kit.hydra_texture: provides the HydraTexture backend that replicator annotators rely on to extract rendered pixel data. Without these, Camera/TiledCamera tests that actually render (as opposed to just testing deprecation warnings or isinstance checks) crash with cudaErrorIllegalAddress because the annotator pipeline silently produces empty/invalid buffers. The non-headless experience file (isaaclab.python.kit) already includes omni.kit.viewport.window, and omni.kit.hydra_texture is transitively pulled by omni.syntheticdata via omni.replicator.core -- but the transitive load order in headless mode causes hydratexture to be imported before the extension has started. Adding it as an explicit dependency ensures correct startup ordering.
There was a problem hiding this comment.
🤖 Isaac Lab Review Bot
Summary
This PR adds two missing Omniverse Kit extension dependencies (omni.kit.viewport.window and omni.kit.hydra_texture) to the headless rendering experience file to fix a startup ordering issue that causes camera annotators to produce empty buffers in truly headless environments (no display). The fix is minimal, targeted, and addresses a real initialization race condition in the Kit extension loading system.
Architecture Impact
Self-contained. This change only affects the .kit experience file used for headless rendering scenarios. It does not modify any Python code, APIs, or runtime behavior — it solely ensures correct extension load ordering at startup. The non-headless experience file (isaaclab.python.kit) already includes omni.kit.viewport.window, so this brings the headless variant to parity. No downstream code changes are required.
Implementation Verdict
Ship it. The fix is correct, minimal, and well-documented in both the PR description and inline comments.
Test Coverage
The PR description demonstrates thorough manual testing:
- Before:
test_tiled_camera_basic_functionality[cuda:0]fails withcudaErrorIllegalAddress - After: All 8 tiled camera test variants pass
However, there is no automated CI enforcement that these tests run in a truly headless environment (DISPLAY unset, no nvidia_drm). The existing test suite likely runs with a display available, which masks this class of bugs.
🟡 Suggestion: Consider adding a CI job that explicitly unsets DISPLAY and runs camera tests to catch regressions in headless rendering support. This is not blocking for this PR, but would prevent future regressions.
CI Status
No CI checks available yet. Once CI runs, verify that camera/tiled camera tests pass — though note that standard CI environments may have display access, which wouldn't exercise the exact failure mode this PR fixes.
Findings
🔵 Improvement: apps/isaaclab.python.headless.rendering.kit:25-26 — Consider explicit ordering if load order is critical
The PR description mentions that "the load order in headless mode causes omni.hydratexture to be imported before the extension has started." While adding explicit dependencies typically ensures correct ordering in Kit's dependency resolver, if there's a specific ordering requirement between omni.kit.viewport.window and omni.kit.hydra_texture, consider documenting which must load first, or verify Kit's resolver handles this correctly. The current placement (viewport.window before hydra_texture) appears intentional and likely correct.
🔵 Improvement: Documentation — Consider adding troubleshooting note
For future maintainers, it would be valuable to document in the Isaac Lab troubleshooting guide that headless rendering requires this specific experience file and what symptoms indicate missing extensions (infinite createViewport loop, empty annotator buffers). This is not blocking.
Final assessment: Clean, minimal fix for a real bug. The inline comments adequately explain why these dependencies are needed. The change aligns with the existing pattern in the non-headless experience file. No concerns with merging.
Greptile SummaryThis PR adds two missing extension dependencies ( Confidence Score: 5/5Safe to merge — minimal, targeted config change that fixes a confirmed headless rendering regression with no P0/P1 findings. The change adds exactly two extension entries to a single .kit config file, directly mirrors the pattern already used in the non-headless counterpart, is accompanied by clear inline comments, and is backed by a full 8/8 test pass on the target hardware. No logic, no runtime code, no schema changes. No files require special attention. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["isaaclab.python.headless.rendering.kit"] --> B["isaaclab.python.headless (dep)"]
A --> C["omni.replicator.core (dep)"]
A --> D["omni.kit.material.library (dep)"]
A --> E["omni.kit.viewport.rtx (dep)"]
A --> F["omni.kit.viewport.window ✅ NEW"]
A --> G["omni.kit.hydra_texture ✅ NEW"]
C --> H["omni.syntheticdata (transitive)"]
H --> I["omni.hydratexture module\n(Python import)"]
G -->|"ensures extension\nstarted before import"| I
F -->|"provides viewport infra\nfor render products"| J["rep.create.render_product_tiled()"]
J --> K["rep.orchestrator.step()"]
style F fill:#2d6a2d,color:#fff
style G fill:#2d6a2d,color:#fff
Reviews (1): Last reviewed commit: "fix: add missing viewport.window + hydra..." | Re-trigger Greptile |
pbarejko
left a comment
There was a problem hiding this comment.
omni.ki.viewport.window brings omni.ui this is too heavy. I will make a PR for this.
# Description This MR is a continuation of #5375 without `omni.ui` as a dependency, only minimal dependencies are added and required code was pushed to the render backend that requires it. Fixes # (issue) ``` cudaErrorIllegalAddress ``` ``` ./isaaclab.sh -p -m pytest source/isaaclab/test/sensors/test_multi_tiled_camera.py -v ``` ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there <!-- As you go through the checklist above, you can mark something as done by putting an x character in it For example, - [x] I have done this task - [ ] I have not done this task --> --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Piotr Barejko <piotrbarejko@protonmail.com>
# Description This MR is a continuation of isaac-sim#5375 without `omni.ui` as a dependency, only minimal dependencies are added and required code was pushed to the render backend that requires it. Fixes # (issue) ``` cudaErrorIllegalAddress ``` ``` ./isaaclab.sh -p -m pytest source/isaaclab/test/sensors/test_multi_tiled_camera.py -v ``` ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there <!-- As you go through the checklist above, you can mark something as done by putting an x character in it For example, - [x] I have done this task - [ ] I have not done this task --> --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Piotr Barejko <piotrbarejko@protonmail.com>
# Description This MR is a continuation of isaac-sim#5375 without `omni.ui` as a dependency, only minimal dependencies are added and required code was pushed to the render backend that requires it. Fixes # (issue) ``` cudaErrorIllegalAddress ``` ``` ./isaaclab.sh -p -m pytest source/isaaclab/test/sensors/test_multi_tiled_camera.py -v ``` ## Type of change - Bug fix (non-breaking change which fixes an issue) ## Screenshots Please attach before and after screenshots of the change if applicable. <!-- Example: | Before | After | | ------ | ----- | | _gif/png before_ | _gif/png after_ | To upload images to a PR -- simply drag and drop an image while in edit mode and it should upload the image directly. You can then paste that source into the above before/after sections. --> ## Checklist - [x] I have read and understood the [contribution guidelines](https://isaac-sim.github.io/IsaacLab/main/source/refs/contributing.html) - [x] I have run the [`pre-commit` checks](https://pre-commit.com/) with `./isaaclab.sh --format` - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] I have updated the changelog and the corresponding version in the extension's `config/extension.toml` file - [ ] I have added my name to the `CONTRIBUTORS.md` or my name already exists there <!-- As you go through the checklist above, you can mark something as done by putting an x character in it For example, - [x] I have done this task - [ ] I have not done this task --> --------- Co-authored-by: Kelly Guo <kellyg@nvidia.com> Co-authored-by: Piotr Barejko <piotrbarejko@protonmail.com>
Description
The headless rendering experience file (
isaaclab.python.headless.rendering.kit) is missing two extensions required for the annotator/render-product pipeline to function in environments without a display (DGX Cloud, CI containers, SSH sessions):omni.kit.viewport.window: provides viewport infrastructure needed byrep.create.render_product_tiled()to create render products headlessly. Without it,rep.orchestrator.step()triggers an infinitecreateViewportloop, and annotators produce empty buffers.omni.kit.hydra_texture: provides the HydraTexture backend that replicator annotators rely on to extract rendered pixel data. While transitively pulled viaomni.replicator.core → omni.syntheticdata, the load order in headless mode causesomni.hydratextureto be imported before the extension has started, makinght_available = Falsepermanently.The non-headless experience file (
isaaclab.python.kit) already includesomni.kit.viewport.window. Adding both as explicit dependencies ensures correct startup ordering.Type of change
Reproduction
Any
Camera/TiledCameratest that actually renders in headless mode fails:Fix
# Rendering "omni.kit.material.library" = {} "omni.kit.viewport.rtx" = {} +# Headless viewport + texture support — required for annotators/render-products +# without a visible window (e.g. DGX Cloud, CI containers). +"omni.kit.viewport.window" = {} +"omni.kit.hydra_texture" = {}Testing
After the fix, all 8 tiled camera test variants pass:
Tested on DGX Cloud (2x L40, Kit 110.1.1, Isaac Sim v6.0.0-alpha.183, Vulkan headless).