Windows App (MSIX) - #7534
Conversation
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.
|
Thanks for submitting this pull request! The maintainers of this repository would appreciate if you could update the CHANGELOG.md based on your changes. |
…ows store, since msix canot be installed easily without trusted CA signature.msix + public key cer is available in github artifact for testing.
…ered hidden window.
|
Check out this pull request on See visual diffs & provide feedback on Jupyter Notebooks. Powered by ReviewNB |
There was a problem hiding this comment.
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.
Type
Motivation and Context
Checklist:
python util/check_style.py --applyto apply Open3D code styleto my code.
updated accordingly.
results (e.g. screenshots or numbers) here.
Description