Mesa'nin "eliminate frontend refcounting" refactor'u (MR 36296)
set_vertex_buffers'in sahiplik sozlesmesini degistirdi: cagiranin
referansi artik devralinyor. threaded_context'te tc_set_vertex_buffers()
slot'a duz memcpy yapiyor (referans almiyor) ve
tc_call_set_vertex_buffers() surucuye verdikten sonra da birakmiyor --
komut asenkron calistigi icin tamponun hayatta kalmasi tamamen o
devredilen referansa bagli.
Nine eski sozlesmeye gore yazilmisti: odunc isaretci veriyor, referansi
kendinde tutuyordu (eskiden take_ownership=false parametresi vardi).
Refactor'un samplerview parcasi Nine'a uygulanmisti (Mart 2025), ama
vertex/constant buffer parcasi Nine silindikten sonra geldi, dolayisiyla
Nine hic uyarlanmadi.
Sonuc: CSMT kuyrugu komutu calistirmadan once Nine kendi referansini
birakirsa kaynak oluyor; tc replay edince crocus_set_vertex_buffers olu
kaynaga referans almaya calisiyor ve u_inlines.h'de
"pipe_reference_described: count != 1" ile patliyor. Zamanlamaya bagli,
dolayisiyla araliklidir.
Gercek cokme (The Witcher EE, 8086:0166, bes denemenin ikisinde):
pipe_reference_described
crocus_set_vertex_buffers
tc_call_set_vertex_elements_and_buffers
Co-Authored-By: Claude Opus 5 <[email protected]>
Nine Mesa 25.2'de silindi. Bu commit onu 26.2 agacina geri getiriyor:
src/gallium/frontends/nine, src/gallium/targets/d3dadapter9, D3D9 ve
d3dadapter basliklari, meson entegrasyonu ve driconf secenekleri.
Silinmesinden sonra gallium'da degisen ve uyum gerektiren yerler:
- mesa_shader_stage, enum pipe_shader_type'in yerini aldi
- pipe_surface de-pointerize edildi, create_surface kalkti
- u_upload_data/alloc artik referans vermiyor; _ref varyantlarina gecildi
- threaded_context kullanici sabit tamponlarini yuklemiyor (MR 36715),
tc_set_constant_buffer'da assert(!cb->user_buffer) var. SWVP ve
fixed-function yollari icin nine_upload_constant_buffer() eklendi.
- driParseConfigFiles struct API'sine gecti
Ayrica D3D9'un ugradigi ama GL frontend'inin hic gecmedigi uc yolda
surucu hatasi cikti; ucu de burada:
crocus_query.c PIPE_QUERY_GPU_FINISHED ele alinmiyordu
crocus_clear.c clear_render_target gelen pipe_surface'i crocus_surface'e
cast edip ->view okuyordu; Nine kendi surface'ini
uretiyor, format crocus_format_for_usage ile yeniden
turetiliyor
tgsi_to_nir.c TXD'de ddx/ddy bilesen sayisi kirpilmiyordu
Gercek donanimda dogrulandi (8086:0166, crocus, wine 11.0 +
wine-nine-standalone): Max Payne 2, The Witcher EE, Fallout New Vegas,
Warband, L4D1, PAYDAY: The Heist calisiyor.
Co-Authored-By: Claude Opus 5 <[email protected]>
recreate_growing_buffer() batch tamponlarina statik, monoton artan bir GTT
adresi verip EXEC_OBJECT_PINNED ile sabitliyordu (7e82b85). Amac
EXEC_OBJECT_CAPTURE ile birlikte GPU hata dokumlerinde adreslerin sabit
kalmasiydi, ama adres asla geri donusturulmuyordu.
create_batch() her flush'ta iki tampon yaratiyor (command ~20K + state
16K), yani her flush ~36K adres alani yakiyor. IVB'nin PPGTT'si 2 GB;
0x20000000'den baslayinca ~43 bin flush sonra alan bitiyor ve execbuf
ENOSPC donuyor. 60 fps'te birkac dakika: Witcher EE ve Fallout NV'de
oynanisin ortasinda tekrarlanabilir cokme.
Varsayilan artik upstream davranisi (adresi cekirdek secer).
CROCUS_PIN_BATCH=1 ile eski davranis geri gelir.
Ayrica: gonderim hatasi mesaji upstream'de MESA_DEBUG arkasinda. Release
derlemesinde hata tek satir aciklama birakmadan abort() olarak goruluyor
ve teshis edilemiyordu -- yukaridaki ENOSPC'yi bulmak bu yuzden zor oldu.
abort() zaten olumcul; sebebi artik her zaman yaziliyor.
crocus_context.c'deki gecici fprintf teshisi de kaldirildi.
Co-Authored-By: Claude Opus 5 <[email protected]>