Skip to content

Commit c44dbe0

Browse files
committed
readme update
1 parent aa00023 commit c44dbe0

3 files changed

Lines changed: 116 additions & 7 deletions

File tree

‎PROJECT.md‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1652,6 +1652,7 @@ env FIXMAT=1 FIXMAT_MODE=3 NOMOVIES=1 SNDSYNC=1 GPUVS=1 WINDOW=1 ALARM=0 \
16521652
| ALFA TESTİ VARYANTI (`ALFAVAR`) | **−6.32 ± 0.48 (−%17)** | −2.8 ± 1.1 / −0.3 ± 0.8 | −1.8 ± 1.7 / +0.8 ± 1.7 | varsayılan açık (HD: −%27) |
16531653
| EKRAN YÖNLENDİRME (`SCRREDIR`) | −0.02 ± 0.88 | −10.7 ± 1.1 / −10.1 ± 0.8 | **−20.4 ± 1.9 / −21.0 ± 1.8** | varsayılan açık |
16541654
| GEÇİŞ YÜKLEMESİ (DontCare / karalama Z) | +0.6 ± 0.8 | +0.9 ± 1.1 / +0.6 ± 0.6 | +1.6 ± 1.8 / +1.2 ± 1.4 | elendi, kod kaldırıldı |
1655+
| SON İŞLEM ZİNCİRİ (`FBZINCIR`), 2 koşu | −1.07 ± 0.53 / +2.39 ± 1.44 (ort. ≈ −0.7 ± 0.5) | −11.1 / −9.6 okuma, −5.8 / −4.2 yazma | **−12.6 / −9.8 okuma, −12.9 / −10.8 yazma** | varsayılan açık |
16551656

16561657
GPU süresi (DVFS'li, yalnız bilgi): `ALFAVAR` açık 5.28 / kapalı 6.08 ms/kare.
16571658

@@ -1755,6 +1756,59 @@ gradyanı):
17551756
Gözle: kaputun karbon dokusu, jant telleri ve fren diski delikleri artık keskin.
17561757
`UVFIX=0` eski (bulanık) davranış.
17571758

1759+
### SIRALI DOKU YÜKLEME (`TEXORD`) — doku yarışı (2026-10-19)
1760+
1761+
Oyun bazı dokuları her karede yeniden yazıyor: son işlem renk tabloları #8 ve
1762+
#9, 5467 karede 5467 yükleme (`TEXUPSAY=1` sayar). Yükleme `replaceRegion` ile
1763+
anında dokuya gidiyordu. Konuk thread kare N+1'i kaydederken ana thread kare
1764+
N'i kodluyor ya da GPU onu çiziyor. Kare N bu yüzden bazen kare N+1'in
1765+
tablosunu, hatta yarım yazılmış tabloyu görüyordu. D3D9'da her çizim
1766+
gönderildiği andaki içeriği görür.
1767+
1768+
Belirtisi şuydu: aynı karede aynı çizimi iki kez kodlamak bile farklı sonuç
1769+
veriyordu (son işlem zinciri doğrulamasında 0.6 M piksel, en çok 2/255).
1770+
1771+
Düzeltme: bir dokunun ikinci ve sonraki yüklemeleri çizim listesine sıralı kayıt
1772+
olarak giriyor. Veri karenin yükleme alanına kopyalanıyor (çift tampon, 8 MB),
1773+
kodlamada çizimlerle sıralı bir blit (tampondan dokuya) oluyor. İlk yükleme
1774+
(yükleme ekranı, henüz kullanılmamış doku) eskisi gibi anında. Atlanan
1775+
(kodlanmayan) karenin bekleyen yüklemeleri, tampon yeniden kullanılmadan önce
1776+
anında uygulanıyor. Kare başına ~2.3 yükleme, taşma 0. Sonra aynı çizim iki kez
1777+
kodlanınca **0 piksel fark**. `TEXORD=0` eski davranış.
1778+
1779+
### SON İŞLEM ZİNCİRİ (`FBZINCIR`) — üç geçiş tek geçişte (2026-10-19)
1780+
1781+
Son işlem üç tam ekran geçişle renk tablosu uyguluyor: `#3 = ps28(#2)`,
1782+
`#2 = ps27(#3)`, `#3 = ps26(#2)`. Her adımın girdisi bir öncekinin aynı
1783+
pikseldeki çıktısı. Ölçüldü (`ABTEST=SKIPPS` + `SKIPPS=26,27,28`): üç geçiş GPU
1784+
enerjisinin ~%16'sı, DRAM'de ~33 MB/kare.
1785+
1786+
Zincir şimdi iki hedefi birden bağlayan tek bir geçişte çiziliyor. Her adım
1787+
girdisini dokudan değil karo belleğinden okuyor (`[[color(n)]]`, Apple GPU'da
1788+
çizim sırasıyla). Gölgelendirici varyantı (`vsemu.c` `ps_to_msl_fb`) aşama 0
1789+
örneğini karo bellek girdisiyle değiştiriyor; arka planda derleniyor, hazır
1790+
olana kadar eski yol kullanılıyor.
1791+
1792+
Koşullar (kayıt başına):
1793+
- tek dörtgen, hedefi tam kaplıyor;
1794+
- Z, karışım ve alfa testi yok;
1795+
- aşama 0 dokusu diğer zincir hedefi, aynı boyut ve biçimde;
1796+
- UV teksel merkezine 1:1 (UV ÖLÇEĞİ sonrası);
1797+
- ps aşama 0'ı tek yerde `TCRD(0)` ile örnekliyor;
1798+
- diğer aşamalar zincir hedeflerini okumuyor;
1799+
- ardışık kayıtlar iki hedef arasında gidip geliyor.
1800+
1801+
Doğrulama: `FBZINCIR=2` zinciri eski yoldan çiziyor, aynı girdiyle birleşik
1802+
yolu karalama dokularına çiziyor ve ikisini GPU'da piksel piksel
1803+
karşılaştırıyor. Sonuç: 5454 zincirde **0 fark**, hem son çıktıda hem ara
1804+
hedefte. `FBZCTRL=1` yardımcıyı normal boru hattıyla, `FBZCTRL=2` iki kez
1805+
çalıştırıp kendisiyle karşılaştırıyor; determinizm testi bu ikisi.
1806+
Doku yarışı düzeltilmeden önce sonuç 1–3/255'lik farklar veriyordu. O
1807+
farkların kaynağı zincir değil, yukarıdaki yarıştı.
1808+
1809+
Kazanç: DRAM −23 MB/kare (iki koşu); GPU çekirdek enerjisi ölçüm gürültüsü
1810+
içinde (ort. ≈ −0.7 ± 0.5 mJ/kare). Kare başına ~1.3 zincir (yarış + menü).
1811+
17581812
### Elenenler
17591813

17601814
- **GEÇİŞ YÜKLEMESİ:** tam ekran kaplayan çizimle başlayan geçişte renk
@@ -1778,3 +1832,8 @@ Yeni anahtarlar:
17781832
| `ALFAVAR=0/2/3` | testsiz varyantı kapat / sayaçlı tanı (ps başına; ayrıca [0,1] dışı köşe rengi sayımı) / tanının pozitif kontrolü |
17791833
| `RENKSAT=0` | köşe rengi kırpmasını kapat (eski, D3D9'a aykırı) |
17801834
| `UVFIX=0` | ölçekli hedeflerde yarım teksel düzeltmesini kapat (eski, bulanık) |
1835+
| `TEXORD=0` | tekrar yüklenen dokuları anında yaz (eski, yarışlı) |
1836+
| `TEXUPSAY=1` | çıkışta doku başına yükleme sayısı (en çok 12) |
1837+
| `FBZINCIR=0/2` | son işlem zinciri birleştirmesini kapat / birebirlik doğrulaması |
1838+
| `FBZCTRL=1/2` | (`FBZINCIR=2` ile) yardımcıyı normal boru hattıyla çalıştır / kendisiyle karşılaştır |
1839+
| `SKIPPS=…` + `ABTEST=SKIPPS` | o ps'lerin bedelini koşu içinde ölç (yalnız KAPALI dilimlerde atlar) |

‎README.md‎

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1-
# NFSU2 on Apple Silicon — static recompilation of a Win32/x86 game to native ARM64
1+
# Need for Speed: Underground 2 on Mac — native Apple Silicon port, no Wine
22

3-
This repository contains the tools and runtime that turn the original Windows
4-
executable of *Need for Speed: Underground 2* (2004, 32-bit x86, Direct3D 9)
5-
into a **native ARM64 macOS binary**. The game's x86 machine code is lifted to
6-
C ahead of time and compiled with clang. There is no Wine, no emulator, no JIT
7-
and no Windows involved at run time.
3+
**Play *Need for Speed: Underground 2* (NFSU2, 2004) natively on Apple Silicon
4+
Macs (M1 and later): no Wine, no CrossOver, no emulator, no virtual machine.**
5+
6+
NFSU2Recomp is a static recompiler and runtime that turn the original Windows PC
7+
executable of the game (`SPEED2.EXE`, 32-bit x86, Direct3D 9) into a **native
8+
ARM64 macOS app**. The game's x86 machine code is lifted to C ahead of time and
9+
compiled with clang; Direct3D 9 is translated to Metal, DirectSound to
10+
CoreAudio. There is no Wine, no emulator, no JIT and no Windows involved at run
11+
time. On an M1 Pro, races run at **119 fps** (the display's limit), against
12+
**10–15 fps** for the same game under Wine.
813

914
> **This repository contains no game code and no game assets.** It contains the
1015
> recompiler and the runtime only. You need your own copy of the game; the C
@@ -168,6 +173,47 @@ OVERRIDE=60fab0,61e390,61f130,5c7ed0,50d510,65ae35,6623ea,66aa3f,66ace2,6691b1,6
168173

169174
`run.sh` documents the environment switches; most are diagnostics.
170175

176+
## FAQ
177+
178+
**Can I play Need for Speed: Underground 2 on a Mac?**
179+
Yes, on an Apple Silicon Mac (M1 or later) with your own copy of the PC game.
180+
Build the port as described above; `./pack.sh` produces a double-clickable
181+
`NFSU2.app`. Menus, races and sound work.
182+
183+
**Do I need Wine, CrossOver, Whisky, Parallels or a virtual machine?**
184+
No. The game's code is recompiled to native ARM64 and runs directly on macOS.
185+
Rosetta 2 is not used to run the game (only, optionally, by one test tool).
186+
187+
**Is it faster than Wine or CrossOver?**
188+
On an M1 Pro at 1280×960: 119 fps in races (capped by the 120 Hz display)
189+
against 10–15 fps under Wine 11.18 with Rosetta 2, and 119 fps against 45 fps
190+
in the 3D menus. Method and raw numbers are in `WINE_KIYAS.md`.
191+
192+
**Is there a ready-made download?**
193+
No. The recompiled program is derived from EA's executable, so it is built on
194+
your own Mac from your own copy of the game and is not distributed.
195+
196+
**Which version of the game does it need?**
197+
The Windows PC version, with the exact `SPEED2.EXE` listed under
198+
[Requirements](#requirements). Other builds, including the console versions,
199+
are not supported.
200+
201+
**Does it work on Intel Macs?**
202+
No. Only Apple Silicon is targeted and tested.
203+
204+
**What does not work yet?**
205+
Videos are skipped, there is no gamepad or wheel support and no online play.
206+
See [Known limitations](#known-limitations).
207+
208+
**How is this different from other NFSU2 projects?**
209+
210+
| Project | Approach | Platforms |
211+
|---|---|---|
212+
| **NFSU2Recomp** (this) | Recompiles the PC executable with its own x86 → C lifter; own Direct3D 9 → Metal renderer | macOS (Apple Silicon) |
213+
| [OpenUG2](https://github.com/whoismept/OpenUG2) | Reimplements the engine from scratch and reads the game's data files; does not run the original code | Linux, macOS, Windows |
214+
| [nfsu2-recompiled](https://github.com/codepdbh/nfsu2-recompiled) | Recompiles the PC executable with pcrecomp; Direct3D 9 through DXVK | Windows, Android |
215+
| [nfsu2-sw](https://github.com/antoxa2584x/nfsu2-sw) | Recompiles the original Xbox version with xboxrecomp | Nintendo Switch, Linux |
216+
171217
## Related work
172218

173219
Static recompilation of x86 is not new, and this is not the first project to do

‎runtime/metal.m‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4415,7 +4415,11 @@ static MTLBlendOperation d3d_blendop(unsigned op){
44154415
* okumuyor. Ardisik kayitlar iki hedef arasinda gidip geliyor.
44164416
* FBZINCIR=0 kapatir; FBZINCIR=2 dogrulama: zincir eski yoldan cizilir, ayni
44174417
* girdiyle birlesik yol karalama dokularina cizilir ve ikisi GPU'da piksel
4418-
* piksel karsilastirilir (rapor: "fark eden piksel", 0 olmali). */
4418+
* piksel karsilastirilir (rapor: "fark eden piksel", 0 olmali; olculdu
4419+
* 2026-10-19: 5454 zincirde 0). FBZCTRL=1 yardimciyi normal boru hattiyla,
4420+
* FBZCTRL=2 iki kez calistirip kendisiyle karsilastirir (determinizm; SIRALI
4421+
* DOKU YUKLEME'den once burada 1-3/255 fark cikiyordu).
4422+
* Kazanc (ABTEST=FBZINCIR, iki kosu): DRAM -23 MB/kare, GPU enerjisi gurultu icinde. */
44194423
static int fbz_mode(void){
44204424
static int m = -1; if (m < 0){ const char *e = ENVC("FBZINCIR"); m = (e && *e) ? atoi(e) : 1; }
44214425
return m;

0 commit comments

Comments
 (0)