Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 

Repository files navigation

Rhino 6 on Linux — a working, tuned setup

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


TL;DR — the three things nobody tells you

# 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.


1. The NVIDIA driver will crash your desktop

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:i386

The :i386 packages are not optional. The nvidia-driver-580 metapackage 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.


2. Installing Rhino 6 in CrossOver

CrossOver bundles its own patched Wine, so you don't need the WineHQ repo and it won't touch a system Wine install.

Create the bottle

/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.

Install dependencies into that bottle, in this order

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.

Install Rhino

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.*.exe

In 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

3. The launcher

./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 bugs

What it does, and why

Virtual 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.

Two things that seem like fixes and are not

__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.

Making the desktop icon use it

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.desktop

With --pick %f you get a file chooser on click, and drag-and-drop onto the icon opens that file directly.


4. Known remaining issues

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.

Performance

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.


5. Watch out for unit conversion on import

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.


Credits

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.

Licence

MIT — see LICENSE.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages