Skip to content

fix: add missing viewport.window + hydra_texture deps for headless rendering#5375

Closed
pv-nvidia wants to merge 1 commit into
isaac-sim:developfrom
pv-nvidia:fix/headless-rendering-deps
Closed

fix: add missing viewport.window + hydra_texture deps for headless rendering#5375
pv-nvidia wants to merge 1 commit into
isaac-sim:developfrom
pv-nvidia:fix/headless-rendering-deps

Conversation

@pv-nvidia
Copy link
Copy Markdown

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 by rep.create.render_product_tiled() to create render products headlessly. Without it, rep.orchestrator.step() triggers an infinite createViewport loop, 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 via omni.replicator.core → omni.syntheticdata, the load order in headless mode causes omni.hydratexture to be imported before the extension has started, making ht_available = False permanently.

The non-headless experience file (isaaclab.python.kit) already includes omni.kit.viewport.window. Adding both as explicit dependencies ensures correct startup ordering.

Type of change

  • Bug fix (non-breaking change that fixes an issue)

Reproduction

Any Camera/TiledCamera test that actually renders in headless mode fails:

# On a headless machine (no DISPLAY, no nvidia_drm):
DISPLAY= python -m pytest source/isaaclab/test/sensors/test_tiled_camera.py -v
# test_tiled_camera_basic_functionality[cuda:0] → FAILED (cudaErrorIllegalAddress)

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:

test_tiled_camera_deprecation_warning[cuda:0]    PASSED
test_tiled_camera_deprecation_warning[cpu]        PASSED
test_tiled_camera_cfg_deprecation_warning[cuda:0] PASSED
test_tiled_camera_cfg_deprecation_warning[cpu]    PASSED
test_tiled_camera_is_camera_subclass[cuda:0]      PASSED
test_tiled_camera_is_camera_subclass[cpu]         PASSED
test_tiled_camera_basic_functionality[cuda:0]     PASSED
test_tiled_camera_basic_functionality[cpu]        PASSED

Tested on DGX Cloud (2x L40, Kit 110.1.1, Isaac Sim v6.0.0-alpha.183, Vulkan headless).

…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.
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 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 with cudaErrorIllegalAddress
  • 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.

@github-actions github-actions Bot added bug Something isn't working isaac-sim Related to Isaac Sim team labels Apr 23, 2026
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 23, 2026

Greptile Summary

This PR adds two missing extension dependencies (omni.kit.viewport.window and omni.kit.hydra_texture) to the headless rendering experience file (isaaclab.python.headless.rendering.kit) to fix annotator/render-product failures in display-less environments. The non-headless counterpart (isaaclab.python.kit) already includes omni.kit.viewport.window at line 82, and the fix correctly mirrors that pattern for the headless path.

Confidence Score: 5/5

Safe 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

Filename Overview
apps/isaaclab.python.headless.rendering.kit Adds omni.kit.viewport.window and omni.kit.hydra_texture to fix headless annotator/render-product pipeline; change is minimal, well-commented, and mirrors the non-headless kit's existing dependency.

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
Loading

Reviews (1): Last reviewed commit: "fix: add missing viewport.window + hydra..." | Re-trigger Greptile

Copy link
Copy Markdown
Collaborator

@pbarejko pbarejko left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

omni.ki.viewport.window brings omni.ui this is too heavy. I will make a PR for this.

@pbarejko pbarejko mentioned this pull request Apr 24, 2026
7 tasks
pbarejko added a commit that referenced this pull request Apr 24, 2026
# 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>
@pv-nvidia pv-nvidia closed this Apr 24, 2026
mmichelis pushed a commit to mmichelis/IsaacLab that referenced this pull request Apr 29, 2026
# 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>
bdilinila pushed a commit to bdilinila/IsaacLab that referenced this pull request Apr 29, 2026
# 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working isaac-sim Related to Isaac Sim team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants