Skip to content

Testing Embree4 + WinArm#84

Open
jdumas wants to merge 69 commits into
mainfrom
jdumas/embree4
Open

Testing Embree4 + WinArm#84
jdumas wants to merge 69 commits into
mainfrom
jdumas/embree4

Conversation

@jdumas
Copy link
Copy Markdown
Contributor

@jdumas jdumas commented Feb 20, 2026

No description provided.

@jdumas jdumas changed the title Testing upstream Embree4 + WinArm Testing Embree4 + WinArm Apr 4, 2026
jdumas and others added 29 commits May 4, 2026 08:10
- Add embree-winarm.patch: guards _tzcnt_u64, _lzcnt_u64, _pext_u32/_pdep_u32
  with !defined(_M_ARM64) (MSVC ARM64 macro, missing alongside __aarch64__)
- simde.cmake: disable SIMDE native NEON on MSVC ARM64 to avoid __m128/__m128i
  being the same underlying __n128 type, which breaks WindingNumber overloads

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e ARM64 fix

Strawberry patch.exe is strict about hunk line counts and running offsets,
causing hunk 3 to search at the wrong line. Use file(READ)+string(REGEX
REPLACE)+file(WRITE) instead to apply _M_ARM64 guards in intrinsics.h.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ARM64 Python on GitHub Actions hostedtoolcache lacks development files
(headers + import lib). CMake falls back to x64 Python's Development.Module,
but MSVC in ARM64 mode cannot link against the x64 python313.lib, producing
hundreds of unresolved __imp_Py* linker errors.

Fix: split the Windows configure step to pass -DLAGRANGE_MODULE_PYTHON=OFF
for windows-11-arm, and update CMakeLists.txt to honor an explicit
-DLAGRANGE_MODULE_PYTHON=OFF even when LAGRANGE_ALL=ON.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The module-inclusion loop unconditionally honored LAGRANGE_ALL, so passing
-DLAGRANGE_MODULE_PYTHON=OFF together with -DLAGRANGE_ALL=ON still pulled
modules/python into the build. Capture the cache state before option()
materializes the default value, then skip modules the user explicitly
disabled even when LAGRANGE_ALL is set.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Instead of disabling Python, install the ARM64 Python with its full
development files by passing architecture: arm64 to setup-python.
Without this, setup-python only installs the ARM64 interpreter (no
python313.lib or headers), causing CMake FindPython to fall back to
the x64 Python for Development.Module -- which the ARM64 MSVC
toolchain cannot link against.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The windows-11-arm hostedtoolcache Python only ships the interpreter;
it lacks python3XX.lib and headers needed for extension module linking.

After MSVC dev-cmd setup, synthesize the ARM64 import library from the
ARM64 python3XX.dll using lib.exe /DEF /MACHINE:ARM64, and copy the
architecture-neutral headers from the x64 Python install if absent.
Then pass -DPython_EXECUTABLE and -DPython_FIND_REGISTRY=NEVER to CMake
so FindPython uses the now-complete ARM64 Python rather than falling
back to the x64 install (which the ARM64 MSVC toolchain cannot link).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
The windows-11-arm hostedtoolcache Python ships only the interpreter
binary — no include/ headers and no libs/python3XX.lib — so CMake's
FindPython falls back to x64 Python for Development.Module, which the
ARM64 MSVC toolchain cannot link against.

Use astral-sh/setup-uv + uv python install to pull a
python-build-standalone distribution instead. These distributions
include full dev files. uv intentionally defaults to x64-emulated
Python on Windows ARM64 runners (uv PR #13724), so we pin the
cpython-3.13-windows-aarch64 specifier to get the native build.

Pass -DPython_EXECUTABLE and -DPython_FIND_REGISTRY=NEVER to CMake so
FindPython uses the uv-managed ARM64 Python and does not fall back to
the registry-registered x64 Python.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Intel MKL has no Windows ARM64 support — skip MKL/BLAS setup on that
platform. DirectSolver.h already falls back to Eigen::SimplicialLDLT
when LA_SOLVER_MKL is not defined, so no header changes are needed.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- modules/CMakeLists.txt: revert _user_disabled_module mechanism; the
  Eigen solver fix means no modules need explicit ARM64 exclusions
- CMakeLists.txt: revert LAGRANGE_MODULE_PYTHON guard back to the simple
  LAGRANGE_ALL check (same motivation)
- embree.cmake: replace string(REPLACE) hack with git apply on a corrected
  embree-winarm.patch (fixed hunk offsets 91→92, 141→142); use
  --ignore-whitespace to handle CRLF from git-cloned sources on Windows
- simde.cmake: remove global SIMDE_NO_NATIVE for MSVC ARM64; the issue
  was specific to WindingNumber, not all simde consumers
- winding_number.cmake + winding-number-winarm.patch: fix VM_SSEFunc.h at
  source level — on MSVC ARM64, simde__m128 and simde__m128i are both
  __n128, making plain typedefs identical and breaking all overloaded
  functions (vm_shuffle, vm_extract, vm_v4sf/vm_v4si). Replace typedefs
  with distinct wrapper structs that carry implicit conversions, and guard
  the union-based MSVC cast functions with !defined(_M_ARM64)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…sse-adobe fork

The dousse-adobe fork's intrinsics.h has trailing spaces on the AVX2
preprocessor guards at lines 94 and 143. The patch's minus lines must
match exactly (git apply --ignore-whitespace only ignores trailing
whitespace in context lines, not in minus lines).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… fix hunk 2

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ll sites

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Force-include a non-fatal eigen_assert override that logs each alignment failure to stderr (first 30 hits) instead of aborting/popping a CRT dialog. Disable Unix and non-ARM64 Windows jobs to iterate fast on the only failing config.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Replace the temporary EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT workaround with a
non-fatal eigen_assert override that uses cpptrace::generate_trace() to print
a full stack trace whenever the failing assertion originates from
DenseStorage.h (the plain_array<> alignment check). All other eigen_assert
failures still abort to keep unrelated invariants surfaced.

Trim CI to the smallest possible reproducer:
- Disable Unix matrix.
- Windows matrix reduced to windows-11-arm Debug only.
- Configure only LAGRANGE_MODULE_SERIALIZATION2 (no LAGRANGE_ALL, no Python).
- Scope ctest to -R 'serialization2|serialize_'.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…ERFACE

install(EXPORT Eigen_Targets ...) was failing because Eigen3_Eigen INTERFACE
linked a target outside the export set. Wrap the diagnostic compile options,
defines, and link with $<BUILD_INTERFACE:> so they only apply during the
local build and are stripped from the install/export.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…uard

Last run produced [EIGEN_DIAG #N] header lines but no cpptrace frames followed.
Switch to to_string(false) + fprintf(stderr) so output uses the same C stream
as the header, log frame count, and catch exceptions in case symbol resolution
or unwinding fails on Win ARM64.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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.

1 participant