Skip to content

Windows App (MSIX) - #7534

Open
ssheorey wants to merge 12 commits into
mainfrom
ss/win-app-3
Open

Windows App (MSIX)#7534
ssheorey wants to merge 12 commits into
mainfrom
ss/win-app-3

Conversation

@ssheorey

Copy link
Copy Markdown
Member
  • Windows app packaging infrastructure.
  • 3DGS rendering fix for the case of multiple GPUs (e.g. integrated + discrete)

Type

  • Bug fix (non-breaking change which fixes an issue): Fixes #
  • New feature (non-breaking change which adds functionality). Resolves #
  • Breaking change (fix or feature that would cause existing functionality to not work as expected) Resolves #

Motivation and Context

Checklist:

  • I have run python util/check_style.py --apply to apply Open3D code style
    to my code.
  • This PR changes Open3D behavior or adds new functionality.
    • Both C++ (Doxygen) and Python (Sphinx / Google style) documentation is
      updated accordingly.
    • I have added or updated C++ and / or Python unit tests OR included test
      results
      (e.g. screenshots or numbers) here.
  • I will follow up and update the code if CI fails.
  • For fork PRs, I have selected Allow edits from maintainers.

Description

Adds AppxManifest, store icon assets, and a build_msix.ps1 packaging script under cpp/apps/Open3DViewer/WindowsMSIX/, wires MSIX packaging into the Open3DViewer CMake target, and adds a Windows CI workflow step to build the MSIX package.
On hybrid-GPU systems (e.g. Intel integrated + discrete), Vulkan's discrete-GPU-preferred device selection could pick a different physical adapter than the one the OS bound the OpenGL context to, causing GL_EXT_memory_object cross-adapter texture import to silently fail with GL_OUT_OF_MEMORY and crash later with STATUS_FAIL_FAST_EXCEPTION in glTextureStorageMem2DEXT.

Fix: create the shared OpenGL context before Vulkan initialization, query its DXGI adapter LUID (Windows) or GL_DEVICE_UUID_EXT (other platforms) via GaussianSplatOpenGLContext::GetAdapterId(), and thread it into GaussianSplatVulkanInteropContext::SelectPhysicalDevice() so Vulkan device selection prefers the physical device matching the GL context's adapter, falling back to best-effort scoring if no match is found.

Also fixes an unrelated HANDLE-to-int truncation bug in AllocateExportableImage, sets GL_DEDICATED_MEMORY_OBJECT_EXT and GL_TEXTURE_TILING_EXT before importing Vulkan-allocated memory into GL (required since allocations use dedicated allocation and optimal tiling), and disables MSAA before render target setup in the geometry pass.
@update-docs

update-docs Bot commented Aug 14, 2026

Copy link
Copy Markdown

Thanks for submitting this pull request! The maintainers of this repository would appreciate if you could update the CHANGELOG.md based on your changes.

@ssheorey ssheorey added this to the v0.20 milestone Aug 14, 2026
ssheorey and others added 4 commits August 14, 2026 22:42
…ows store, since msix canot be installed easily without trusted CA signature.msix + public key cer is available in github artifact for testing.
@review-notebook-app

Copy link
Copy Markdown

Check out this pull request on  ReviewNB

See visual diffs & provide feedback on Jupyter Notebooks.


Powered by ReviewNB

@ssheorey
ssheorey requested a lite review from Copilot August 17, 2026 05:26
@ssheorey
ssheorey marked this pull request as ready for review August 17, 2026 05:26

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR adds Windows MSIX packaging support for the Open3D Viewer and improves 3D Gaussian Splatting (3DGS) rendering robustness on multi-GPU systems by ensuring Vulkan and OpenGL contexts land on the same physical adapter (required for GL_EXT_memory_object interop).

Changes:

  • Introduces MSIX build/CI infrastructure for the Windows Viewer (manifest + packaging script + workflow changes).
  • Adds GPU adapter identity/steering helpers and wires them into Filament/GLFW initialization to avoid cross-adapter Vulkan↔OpenGL interop failures on hybrid systems.
  • Applies several 3DGS stability fixes (Win32 handle width, dedicated memory-object parameter, optimal tiling, MSAA ordering, non-empty descriptor buffer).

Reviewed changes

Copilot reviewed 22 out of 26 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
docs/jupyter/visualization/gaussian_splatting.ipynb Adds guidance for multi-GPU setups when running 3DGS.
cpp/pybind/t/geometry/pointcloud.cpp Minor formatting adjustment in pybind definition.
cpp/open3d/visualization/visualizer/GuiVisualizer.cpp Fixes filter description punctuation for Gaussian Splat files.
cpp/open3d/visualization/rendering/GpuAdapterSelection.h Adds cross-API adapter identity + steering/query helper API.
cpp/open3d/visualization/rendering/GpuAdapterSelection.cpp Implements adapter matching/steering for Win32 (DXGI) and Linux (PRIME env vars).
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatVulkanInteropContext.h Extends Vulkan init to support “required adapter”; widens exported handle type.
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatVulkanInteropContext.cpp Improves device selection scoring + fixes Windows interop import requirements (dedicated memory, optimal tiling, handle truncation).
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatVulkanBackend.cpp Adjusts MSAA disabling order relative to Filament render-target binding.
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatPassRunner.cpp Ensures SH coefficient buffer is never size-0 to avoid driver descriptor faults.
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatOpenGLContext.h Exposes native GLFW window handle for adapter identity verification.
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatOpenGLContext.cpp Tweaks GLFW framebuffer hinting (double-buffer) for NVIDIA GLX compatibility.
cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatDesign.md Documents Linux initialization/steering ordering constraint (before glfwInit()).
cpp/open3d/visualization/rendering/filament/FilamentEngine.cpp Wires adapter selection/verification into engine startup for reliable Vulkan↔GL interop.
cpp/open3d/visualization/gui/NativeWin32.cpp Adds native Win32 icon assignment for GLFW windows.
cpp/open3d/visualization/gui/Native.h Declares Win32-only window icon helper.
cpp/open3d/visualization/gui/GLFWWindowSystem.cpp On Linux: init Vulkan/PRIME steering before GLFW; on Windows: apply native icon.
cpp/open3d/visualization/CMakeLists.txt Adds new rendering source file to visualization build.
cpp/open3d/visualization/app/Viewer.cpp Changes viewer logging verbosity behavior.
cpp/apps/Open3DViewer/WindowsMSIX/build_msix.ps1 New: stages, signs, and packs the Viewer into an MSIX.
cpp/apps/Open3DViewer/WindowsMSIX/AppxManifest.xml New: MSIX manifest with file associations/capabilities.
cpp/apps/Open3DViewer/Open3DViewer.xml Adds MIME entries for .splat and .spz.
cpp/apps/CMakeLists.txt Adds MSIX build target and Windows subsystem/entry-point adjustments for Viewer.
.github/workflows/windows.yml Updates viewer artifact packaging and adds MSIX build + artifact upload steps.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread cpp/open3d/visualization/app/Viewer.cpp Outdated
Comment thread cpp/open3d/visualization/gui/NativeWin32.cpp
Comment thread cpp/open3d/visualization/rendering/gaussian_splat/GaussianSplatOpenGLContext.cpp Outdated
Comment thread docs/jupyter/visualization/gaussian_splatting.ipynb
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants