Rhino 3D running properly on Linux under CrossOver, with hardware OpenGL on an NVIDIA GPU and input latency low enough to actually draft with.
Most "Rhino on Wine" guides target Rhino 7. This one is specifically Rhino 6, which has the worse reputation of the two and no reproducible recipe published anywhere I could find. It works fine — but three separate problems have to be solved first, and none of them are in the existing guides.
Verified on: Ubuntu 22.04.5 LTS · kernel 6.8 · CrossOver 26.3.0 · Rhino 6.35.21222.17001 · NVIDIA RTX 3090 Ti · GNOME 42 / X11
| # | Problem | Cause | Fix |
|---|---|---|---|
| 1 | X server crashes, logs you out the moment Rhino opens a viewport | Bug in the NVIDIA 535 driver's OpenGL path | Upgrade to 580+ |
| 2 | Viewport doesn't repaint until you zoom to "kick" it | Wine's partial-redraw damage never reaches X | Run in a Wine virtual desktop |
| 3 | Everything lags — clicks register a beat late | NVIDIA pre-renders 2–3 frames | __GL_MaxFramesAllowed=1 |
All three are handled by launcher/run-rhino.sh,
except the driver upgrade which you must do yourself.
This one is brutal and looks like Rhino is at fault. It isn't.
On NVIDIA 535.x, the moment Rhino initialises its OpenGL viewport the X
server segfaults and takes your entire desktop session with it — you get
dumped back to the login screen. From ~/.local/share/xorg/Xorg.0.log:
(EE) Backtrace:
(EE) 2: /usr/lib/x86_64-linux-gnu/nvidia/xorg/nvidia_drv.so (nvidiaUnlock+0x808a4)
(EE) 3: /usr/lib/x86_64-linux-gnu/nvidia/xorg/nvidia_drv.so (nvidiaUnlock+0x6b513)
(EE) 4: /usr/lib/x86_64-linux-gnu/nvidia/xorg/nvidia_drv.so (nvidiaUnlock+0x43af08)
(EE) Segmentation fault at address 0xb21
Fatal server error:
(EE) Caught signal 11 (Segmentation fault). Server aborting
Three frames deep in nvidia_drv.so. Because the driver runs inside the X
server, its crash is your session's crash.
Confirm it's the driver, not Rhino, by forcing software GL — this cannot touch the NVIDIA driver, so if Rhino starts, the driver is your problem:
LIBGL_ALWAYS_SOFTWARE=1 GALLIUM_DRIVER=llvmpipe \
/opt/cxoffice/bin/wine --bottle rhino6 \
"$HOME/.cxoffice/rhino6/drive_c/Program Files/Rhino 6/System/Rhino.exe"Fix — upgrade the driver. 580 is a mature branch and also satisfies CUDA 12.8's ≥570 requirement, so it improves any CUDA work on the same machine:
sudo apt install nvidia-driver-580 \
libnvidia-gl-580:i386 libnvidia-compute-580:i386 \
libnvidia-decode-580:i386 libnvidia-encode-580:i386The
:i386packages are not optional. Thenvidia-driver-580metapackage does not pull them in, and without them every 32-bit Wine process loses OpenGL. You'd trade a crash for a subtler broken state.
Before rebooting, verify the kernel module actually built for your running kernel — otherwise you reboot into a black screen:
dkms status | grep "nvidia/580.*$(uname -r)"Recovery if it goes wrong: Ctrl+Alt+F3, then
sudo apt install --allow-downgrades nvidia-driver-535, then reboot.
CrossOver bundles its own patched Wine, so you don't need the WineHQ repo and it won't touch a system Wine install.
/opt/cxoffice/bin/cxbottle --bottle rhino6 --create \
--template win10_64 --description "Rhino 6"Windows 10, 64-bit. Not Windows 11 — Rhino 6 predates it and its installer sniffs the OS version. Not 32-bit — .NET 4.8 misbehaves in 32-bit bottles.
Via CrossOver's Install Windows Software, targeting the rhino6 bottle:
| Order | Component | Why |
|---|---|---|
| 1 | Visual C++ 2019 Redistributable | Rhino 6's installer crashes while installing the VC++ redist. Pre-seed it and the installer skips that step. This is the documented Rhino 6 blocker. |
| 2 | .NET Framework 4.8 | Rhino 6 is .NET Framework based. Slow — can look frozen for 10+ min. |
| 3 | Corefonts | Missing fonts are the single most common cause of Rhino crashing under Wine. |
Do not install GDI+ — CrossOver already ships it. (winetricks needs it added manually; CrossOver doesn't.) Verify:
find ~/.cxoffice/rhino6/drive_c/windows -iname "gdiplus*"If .NET 2.0 SP2 fails with HTTP 429 — skip it. CrossOver's dependency chain may try to pull it in. Microsoft's legacy download servers rate-limit, and .NET 2.0/3.5 and 4.x are separate runtime families, not a ladder. Rhino 6 targets 4.x. Clicking Skip This Step is correct.
Run the installer explicitly against the bottle — this avoids CrossOver's install wizard defaulting to creating a new bottle, which is the most common way to end up with dependencies and application in different places:
/opt/cxoffice/bin/wine --bottle rhino6 ~/Downloads/rhino_en-us_6.*.exeIn the installer set License Method: This Computer — the "Rhino Account" (Cloud Zoo) path throws you into an embedded browser login on first launch, which is an extra thing to break before you've learned whether Rhino works at all. You can switch afterwards in Tools → Options → Licenses.
Also untick "Allow Rhino to automatically download new versions" — the auto-updater is unreliable under Wine.
The installer will appear to exit while still running. Clear the leftovers before first launch:
CX_BOTTLE=rhino6 /opt/cxoffice/bin/wineserver -k./launcher/run-rhino.sh # normal start
./launcher/run-rhino.sh --pick # file chooser first
./launcher/run-rhino.sh job.3dm # open a file
./launcher/run-rhino.sh --kill # close a running instance first
./launcher/run-rhino.sh --plain # no fixes — reproduce the bugsVirtual desktop — fixes the stale viewport.
Without it, Rhino's windows are native X windows and its partial-redraw
damage has to survive Wine → X11 → the compositor. It doesn't. The viewport
shows a frozen frame until you zoom, which forces a full redraw. With
explorer /desktop=, Wine composites Rhino's child windows internally and
never hands partial damage to the WM.
__GL_MaxFramesAllowed=1 — fixes input lag.
The NVIDIA driver queues 2–3 pre-rendered frames by default. Every queued
frame is another frame of click-to-photon delay. Rhino leaves the GPU almost
idle anyway (32 W of 450 on a 3090 Ti), so there is no throughput cost.
__GL_SYNC_TO_VBLANK=0. The compositor is already vsyncing; doubling up
holds finished frames.
__GL_YIELD=USLEEP — makes latency worse. It's widely recommended for
Wine because it stops GL threads busy-spinning. But a sleeping thread doesn't
wake instantly on input, and you feel it on every click. Leave it unset.
_NET_WM_BYPASS_COMPOSITOR=1 — causes visual corruption. Taking mutter
out of the path does cut latency, but unredirecting the window means every
region Rhino doesn't repaint shows stale framebuffer content — literally
other windows' pixels inside the Rhino viewport. Not worth it. --bypass is
there if you want to see for yourself.
CrossOver's generated .desktop files can be pointed at the script. Because
the bottle is created with MenuMode=ignore, CrossOver won't overwrite them:
sed -i 's|^Exec=.*|Exec=/path/to/run-rhino.sh --pick %f|' \
~/Desktop/Rhino+6.desktop \
~/.local/share/applications/cxmenu-*Rhino\ 6.desktopWith --pick %f you get a file chooser on click, and drag-and-drop onto the
icon opens that file directly.
| Issue | Severity | Notes |
|---|---|---|
| Visual garbage during the first ~5 s of startup | cosmetic | Wine maps the desktop window before Rhino paints it, so you briefly see whatever was on screen. Clears on first full redraw. |
| Viewport layout changes may need a nudge | minor | Switching 4-view ↔ single view can leave a region unpainted; any zoom fixes it. |
| Rendered mode / Rhino Render | broken | Cycles wants CUDA, which Wine does not pass through. Shaded mode is fine. |
| Auto-updater | disabled | Unreliable under Wine; untick it at install. |
Genuinely usable. A 6M-polygon textured photogrammetry mesh orbits with no hiccups. Rhino reports the real GPU:
NVIDIA GeForce RTX 3090 Ti
OpenGL version: 4.6.0 NVIDIA 580.173.02
Total Video Memory: 24 GB
Rhino 6 only requires OpenGL 4.1, so nothing is being given up. Note that Rhino's display pipeline is largely single-threaded — on heavy meshes you'll see one CPU core pegged while the GPU idles. That's true on Windows too, not a Wine artefact.
OBJ files carry no unit metadata. File → Open takes the numbers raw;
File → Import may apply a unit conversion between the incoming file and
the document — which can silently scale your model by 12.
If your model is already in the units you want, prefer Open, then apply your layer/template setup to that file rather than importing into a template.
To check: note a known dimension in the source file, measure the same thing after loading, and see whether the ratio is a suspicious round number (12, 25.4, 39.37). If it is, a unit conversion was applied that you did not ask for.
The Rhino 7 groundwork that made the Rhino 6 attempt worth trying: aaronsb/rhino-wine and the McNeel forum Rhino-on-Wine thread.
Not affiliated with or endorsed by Robert McNeel & Associates or CodeWeavers. You need your own Rhino licence and your own CrossOver licence.
MIT — see LICENSE.