1 puan yazan GN⁺ 5 일 전 | 1 yorum | WhatsApp'ta paylaş
  • DJGPP tabanlı DOS portu SDL'ye eklendi ve video, ses, girdi, iş parçacığı, zamanlayıcı, dosya sistemi ve derleme zinciri dahil geniş bir kapsamla main dalına birleştirildi
  • VGA ve VESA 1.2+ video, Sound Blaster ailesi ses oynatma, PS/2 klavye ve fare, BIOS tabanlı joystick, işbirlikçi iş parçacıkları ve PIT zamanlayıcısı dahil DOS ortamına uygun uyarlamalar eklendi
  • DJGPP'nin seek/read sorunu, seek sırasında arabelleği döküp geri yükleme yöntemiyle aşıldı; böylece SDL_LoadWAV içindeki hatalı okumalar ve birkaç saniyelik gecikmeler ortadan kaldırıldı, ses yolu da IRQ yeniden girişi ve takılmaları azaltacak şekilde iyileştirildi
  • fullscreen siyah ekran sorunu INDEX8 modunun seçilmesiyle bağlantılıydı; DOS'a özel bir hint eklemek yerine mod sırası mantıksal olarak düzenlendi ve imleç saydamlığı sorunu da ek bir commit ile düzeltildi
  • Gerçek donanım testi sınırlıydı; ses kaydı, SDL_LoadObject ve SDL_TIME için DOS'a özgü uygulama gibi bazı özellikler eksik olsa da 46 kontrol geçildi, birleştirme yapıldı ve bu değişiklik 3.6.0 özelliği olarak işaretlendi

DOS platformu destek kapsamı

  • SDL'ye DOS portu eklendi ve DJGPP tabanlı olarak nispeten olgun bir düzeye ulaştı
    • Çalışma birkaç kişi arasında paylaşıldı ve son aşamada kararlılık düzeltmeleri ile eksik özelliklerin tamamlanması eklendi
    • DevilutionX, DOSBox üzerinde kapsamlı biçimde test edildi ancak gerçek donanım testi yoktu
    • Uygun test yöntemi bulunmayan bazı özellikler bilinçli olarak dışarıda bırakıldı
  • Desteklenen özellikler ayrıntılı şekilde listeleniyor
    • Video, VGA ve VESA 1.2+ framebuffer, RGB ve 8 bit indeksli renk, VGA DAC palet programlama, vsync ve donanım sayfa çevirme ile çıkışta VBE durumunu kaydetme ve geri yüklemeyi içeriyor
    • Ses, Sound Blaster 16, Sound Blaster Pro ve Sound Blaster 2.0/1.x desteği sunuyor; IRQ tabanlı DMA ve çift arabellekli auto-init yolunu kullanıyor
    • Girdi, genişletilmiş tarama kodları dahil PS/2 klavye, INT 33h fare ve BIOS INT 15h tabanlı gameport joystick desteğini içeriyor
    • İş parçacıkları, setjmp/longjmp ve yığın yamalama kullanan işbirlikçi bir zamanlayıcı kullanıyor; ayrıca mutex, semaphore, TLS ve condition variable için genel fallback'ler içeriyor
    • Olay pompası ve delay fonksiyonlarına yield noktaları eklenerek ses ve diğer iş parçacıklarının tepkiselliği korunuyor
    • Zamanlayıcı, DJGPP'nin uclock() işlevini kullanan PIT tabanlı bir uygulama ve yaklaşık 1.19 MHz çözünürlüğe sahip
    • Dosya sistemi, GetBasePath ve GetPrefPath için DJGPP'nin searchpath() işlevini kullanıyor; ayrıca POSIX dosya sistemi işlemleri için fallback de içeriyor
    • Derleme, CMake çapraz derleme toolchain dosyası, DJGPP CI işi ve hızlı configure için preseed cache içeriyor
  • Dahil edilmeyen özellikler de açıkça belirtiliyor
    • Ses kaydı yok, yalnızca oynatma destekleniyor
    • SDL_TIME için yerel uygulama ayrı olarak yok; DJGPP'nin POSIX katmanı üzerinden Unix gettimeofday yeniden kullanılıyor
    • Paylaşımlı kütüphane yükleme desteklenmediği için SDL_LoadObject bulunmuyor

Uygulama süreci ve temel değişiklikler

  • DOS portuna giden süreçte birçok commit ile video, ses, girdi, zamanlayıcı, iş parçacığı ve derleme zinciri kademeli olarak eklendi
    • İlk çalışmadan sonra stdio buffering, ses uygulaması, video alt sistemi, dosya sistemi, fare, klavye, CI ve platform algılama sırayla tamamlandı
  • stdio ve dosya erişiminde DJGPP'ye özgü seek/read sorunu aşıldı
    • Başta stdio SDL_IOStreams arabelleğini kapatma denemesi yapıldı ancak daha sonra seek sırasında arabelleği döküp geri yükleme yöntemine geçildi
    • Bu değişiklik, arabelleği tamamen kapatmaktan çok daha hızlıydı ve fseek sonrası yanlış okuma sorununu da önledi
    • SDL_LoadWAV, test/sample.wav dosyasını okurken birkaç saniye süren sorun ortadan kalktı ve doğru veri gelmeye başladı
  • Ses işleme yöntemi de kararlılık odaklı olarak sürekli ayarlandı
    • Başlangıçta Sound Blaster 16 uygulaması vardı; ardından SB16 öncesi 8 bit mono ve SB Pro stereo desteği eklendi
    • Ses miksleme, IRQ işleyicisinde doğrudan çalışan yapıdan ana döngüye, oradan da yeniden SDL ses iş parçacığına taşındı
    • IRQ içinde yeniden giriş sorunlarını önlemek için yön değiştirildi ve yük sırasında eski DMA arabelleğinin yarısı silence ile doldurularak takılmalar azaltıldı
    • Örnekleme oranı ayarı, DSP durum polling'i, DMA bellek tahsisinin gerekçesi ve kesme vektörü geri yüklendikten sonra IRET wrapper'ın kaldırılması da düzenlendi
  • Video tarafı da DOS ortamının kısıtlarına uyacak şekilde genişletildi
    • VESA arayüzü üzerinden yazılım renderer ile çalışan ilk uygulama eklendi
    • Sonrasında 8 bit palet desteği, VBE sayfa çevirme, durum geri yükleme, tek arabellek modunda vsync ve VESA banked framebuffer modu eklendi
    • VBE 1.2+ üzerinde LFB olmadığında framebuffer kopyası bank switching ile yapılıyor ve bu modda sayfa çevirme devre dışı bırakılıyor
    • Video başlatma ve kapatma sırasında tüm VBE durumu kaydedilip geri yüklenerek mod geçişleri temiz hale getiriliyor
  • Girdi ve kesme işleme de gerçek kullanım düzeyine kadar iyileştirildi
    • Klavye, genişletilmiş tarama kodlarını ve Pause tuşunu da ele alıyor; olay saklama için basit bir ring buffer kullanılıyor
    • Fare, duyarlılığı okumak için INT 33h function 0x1B kullanıyor
    • Joystick tarafında BIOS timing loop maliyetini azaltmak için eksen polling yaklaşık 60 Hz ile sınırlandırılıyor, düğmeler ise tepkisellik için her zaman doğrudan polling ile okunuyor
    • ISR kodu ve verisi kilitlenerek kesme sırasında page fault oluşması önleniyor
  • Derleme ve platform algılama sorunları da düzeltildi
    • DJGPP için bir CI işi eklendi ve DOS için CMake platform algılama desteği geldi
    • SDL_PLATFORM_DOS, DOS'a özgü launcher ile çakışmaması için SDL_RunApp() hariç tutma listesine eklendi
    • DJGPP __unix__ tanımlasa bile DOS'ta GTK ya da display server bulunmadığından SDL_Gtk_Quit() DOS için devre dışı bırakılarak link hataları önlendi
    • Bazı DJGPP toolchain'lerinin i386-pc-msdosdjgpp-gcc önekini kullanması da dikkate alındı

Test durumu ve kalan kısıtlar

  • Otomatik testler tamamen sorunsuz bitmese de yamalarla tamamlanabilecek düzeye ulaştı
    • Bazı standart formatting işlevi sorunları nedeniyle otomatik testler sona kadar gidemedi; bunu aşan bir yama ile testler yine de tamamlandı
    • Hâlâ başarısız olan örnekler vardı ancak ilgili formatting işlevinin doğru çözümünden emin olunamadığı için bunlar dahil edilmedi
    • Demoların çoğu genel olarak beklenebilecek düzeyde çalışıyor olarak değerlendirildi
  • Gerçek kullanım sonuçları da paylaşıldı
    • DOSBox ve bir Vortex86 kart üzerinde DOS 6.22 ortamında pencere dışı olmayan mod hem test programlarında hem kullanıcı kodunda iyi çalıştı
    • Ancak o sırada fullscreen, draw.exe --fullscreen gibi örneklerde siyah boş ekran veriyordu
    • Hız yavaş olsa da kullanılabilir seviyede olduğu belirtildi
  • Bazı test programı sorunları da doğrulandı
    • sprite.exe, DOSBox'ta hemen kapanıyor
    • wm.exe ve draw.exe görüntü üretmiyor ancak ESC basıldığında kapanıyor
    • testpalette bir segfault oluşturuyor

Tam ekran renk derinliği seçimi sorunu ve düzeltme

  • fullscreen siyah ekranın doğrudan nedeni, SDL_GetClosestFullscreenDisplayMode() işlevinin INDEX8 moduna düşmesiydi
    • Uygulama INDEX8 render etmeyi desteklemiyorsa ekran siyah görünüyordu
    • İç uygulamada, yalnızca kullanıcı zaten INDEX8 fullscreen modu seçmişse INDEX8 dikkate alınıyordu
  • İlk aşamada yalnızca DOS'ta SDL_HINT_DOS_ALLOW_INDEX8_MODES arkasında INDEX8 modlarını gizleyen bir çözüm eklendi
    • Amaç, uygulama bunu doğru işleyebildiğinde açıkça opt-in yapılmasını sağlamaktı
  • Ancak main dalında en düşük bit derinliği yerine en yüksek bit derinliğini seçen bir değişiklik zaten eklenmişti ve bunun sorunu çözüp çözmediği değerlendirildi
    • Bu değişiklik bpp sorununu çözdü ancak 640x480 best fit isteğinde 1024x768 seçilmesi gibi yeni bir sorun doğurdu
    • Sonunda bu değişiklik geri alındı ve daha iyi düzeltmenin ayrı bir PR'da ele alınmasına karar verildi
  • Son aşamada DOS'a özgü hint kaldırıldı ve mod sırası mantıksal olarak düzenlendi
    • Remove SDL_HINT_DOS_ALLOW_INDEX8_MODES and order modes logically commit'i eklendi
    • #15442 birleştirildiğinde, palet ayarlamayan veya fullscreen modunu doğrudan seçmeyen uygulamalarda bile otomatik mod seçiminin doğru çalışabileceği belirtildi
    • Bununla birlikte, SDL'deki diğer eski sorunların tamamını bu PR içinde sonuna kadar kovalamama sınırı da çizildi

Demo render etme ve imleç düzeltmesi

  • Demoların siyah görünmesi sorunu, yalnızca bu PR'a değil #15442 birleştirilmiş olup olmamasına da bağlıydı
    • SDL_GetClosestFullscreenDisplayMode() en düşük renk derinliğini tercih ettiği sürece bu portta INDEX8 seçiliyor, uygulama palet ayarlamıyorsa siyah ekran oluşuyordu
    • İlgili PR yerelde birleştirildiğinde tüm test hedeflerinin çalıştığı doğrulandı
  • Kalan görsel sorun imleç saydamlığıydı
    • Yerel doğrulama sonrasında yalnızca imlecin saydam olmadığı ortaya çıktı
    • Bunu düzeltmek için Don't convert cursor if dest is not INDEX8 commit'i eklendi
    • Düzeltmeden sonra RGB modunda optimize edilmemiş sürüm kullanılıyor ancak hem RGB hem INDEX8'de doğru çalışıyor
    • XRGB1555 ve RGB565 için biraz daha iyi performans olasılığı bulunsa da düşük öncelikli görüldü

İnceleme ve birleştirme kararı

  • PR için squash merge uygun görüldü
    • GitHub'ın sonuç commit'inde PR referansını koruması sayesinde çalışma sürecinin yine de izlenebilir olduğu düşünüldü
    • Sonuç commit'ine ek katkı sahiplerinin de yazılması önerildi
    • Co-authored-by iki kişi ve Tested-by bir kişi eklenmesine dair somut ifade de yer aldı
  • İncelemeyi yapan kişi, birleştirme sonrasında bazı derleme betiği ifadelerini daha temiz şekilde yeniden yazacağını belirtti
  • Son birleştirme öncesinde diğer ilgili PR'ların da birlikte birleştirilmesi ve DOS PR'ının ilerletilmesi yönünde karar verildi
    • “Last call on DOS pull request!” sonrasında ilgili PR'ların birleştirilme durumu doğrulandı
    • Ardından 46 checks passed durumu ile main dalına birleştirildi
  • Birleştirme sonrasında sürüm kapsamı da netleştirildi
    • Bu değişiklik 3.6.0 özelliği olarak değerlendirildi
    • 3.4.x'e cherry-pick yapılmayacak

      • Birleştirmeden sonraki gün DOS çalışma dalı silindi

Sonraki işler ve kalan donanım sorunları

  • Bazı Nvidia GPU'larda 4f07(SetDisplayStart) uygulamasının düzgün çalışmaması sorunu da gündeme getirildi
    • VOGONS başlığı bağlantısıyla birlikte, raporlarda destek var görünse de gerçekte çalışmayan GPU'lar bulunduğu belirtildi
    • Test kapsamının GeForce 9300'dan 3060'a kadar daha geniş olabileceği yazıldı ancak bunun eldeki donanıma dayalı olduğu ve tam kapsamı temsil etmediği de not edildi
    • Proje tarafındaki testlerde de aynı görüntüleme sorunu gözlendi
  • GPU üreticisine göre SDL'in özelliği kapatması uygun görülmedi; bunun yerine kullanıcı kontrollü bir hint olasılığı gündeme geldi
    • page_flip_available için kullanıcı tarafından kontrol edilebilen yeni bir hint'in daha iyi olabileceği değerlendirildi
    • Bunun hemen yapılmayıp daha sonra eklenebileceği şeklinde bırakıldı
  • Birleştirme sonrasında doğrudan framebuffer kullanımı için bir hint de belirtildi
    • SDL_HINT_DOS_ALLOW_DIRECT_FRAMEBUFFER açılırsa yukarıdaki SetDisplayStart sorununun çok önemli olmayabileceği ifade edildi

1 yorum

 
GN⁺ 5 일 전
Hacker News yorumları
  • Artık tek gereken UEFI için SDL; böylece oyunlar işletim sistemi önyükleme öncesi ortamda da çalıştırılabilir

    • Tüm Intel yonga setlerinde çalışan Intel Management Engine / Minix hâlâ aynı durumda mı merak ediyorum
      güvenliğin daha da sıkılaşıp sıkılaşmadığını ya da hâlâ erişilebilir olup olmadığını da merak ediyorum https://www.zdnet.com/article/minix-intels-hidden-in-chip-operating-system/
    • Aslında o kadar da zor görünmüyor
      Ama bildiğim kadarıyla UEFI’de ses sürücüleri yok ve artık ses codec çipleri için bile yalnızca NDA kapsamındaki veri sayfaları bulunuyor, bu yüzden elle yazmak da zor
      Daha da saçması, graphics output protocol’de vsync bilgisi yok; bu yüzden tearing olmadan blitting yapılamıyor, bu da kelimenin tam anlamıyla VGA’dan bile kötü
    • UEFI biraz modern bir DOS gibi hissettiriyor
    • Dürüst olmak gerekirse müthiş bir görüntü
      grub benzeri bir menüyle açılış yapıp önüne klasik oyun listesi çıktığını düşününce insan heyecanlanıyor
    • Kısacası bu bare metal için SDL
  • Bu ekran görüntüsünü özellikle komik yapan şey, DosBOX’ın zaten SDL üzerinde inşa edilmiş olması

    • O zaman artık DOS içinde çalışan bir dosbox gerekiyor
    • Tam anlamıyla SDLception
  • Bu, DJGPP kullandığı için DPMI aracılığıyla CPU’yu 32 bit moda geçiriyor
    Bu yüzden segmented memory, near pointer ve her yerde karşına çıkan türlü türlü 64KB sınırları ile o gerçek eski okul hissi pek gelmiyor

  • Harika
    SDL binding desteği olan FreeBASIC’in 386+ hedefli MS-DOS çalıştırılabilir dosyalarıyla birlikte nasıl olacağını merak ettim
    [1] - https://github.com/freebasic/fbc

    • Bunu bizzat denemeyi düşünüyorum
      Aslen DOS kökenli olan OHRRPGCE’yi tekrar DOS’a port etmeliyim diye yıllardır aklımın bir köşesinde tutuyordum
      Ayrıca SDL’in SDL 1.2 döneminde mevcut portların ve OS desteğinin neredeyse tamamını agresif biçimde budadığını düşününce, SDL3’ün DOS desteğini geri kazanması oldukça şaşırtıcı
  • Mükemmel
    Bu sabah macOS içindeki VMware Fusion içindeki Debian GNU/Linux içindeki DOSBox-X içindeki Turbo C ile geliştirme yapıyordum; tam üstüne geldi

    • Şaka mıydı ciddiyet miydi gerçekten bilmek isterim
    • Linux için bir turboc türevi mi vardı acaba
      on yıllar önce turboc ile çalıştığıma dair silik bir anım var
    • Öyleyse muhtemelen Inception filmini de seversin :)
  • Teknik olarak bakarsak bu zaten HXDOS ile mümkündü
    Çünkü DirectDraw’ı, SDL’in kullanabileceği kadar iyi emüle ediyordu

    • Bir dakika, ne?
      O zaman hangi SDL hedefi için derlendiğini merak ettim
      Win32’ye özel tam ekran mı, yoksa 640x480 gibi bir VESA çözünürlüğü mü?
  • SDL gibi açık kaynak projelerde bu tür desteklerin eklenmesi genelde değişikliğin ne kadar istilacı olduğuna ve katkı yapan kişinin gerçekten bakımını sürdürüp sürdürmeyeceğine bağlıdır
    Her projenin politikası farklıdır ve SDL’in politikasını bilmiyorum ama zaten çok sayıda portları olduğuna göre neyin altına girdiğini biliyordur diye düşünüyorum

    • Bu tür nadir mimari destekleri neredeyse her zaman bir hayal sahibi kişiyle, bunu gerçekten hayata geçirip sürdüren tek bir kahramanın omzunda yükselir
      Benim en sevdiğim örnek openbsd luna88k https://www.openbsd.org/luna88k.html
      Gerçekten kaç kullanıcısı var hiç bilmiyorum. Muhtemelen yalnızca Japonya’da satılmış oldukça nadir bir makineydi ve eğer kullanıcıları varsa çoğu da muhtemelen Japonya’dadır; benim görüş alanımın dışında olduğu için bana sanki tek kullanıcı portu yapan kişiymiş gibi geliyor
      Ama buna rağmen her sürümde, resmî duyurudan birkaç hafta sonra ormandan çıkıp gelmiş gibi luna88k dosyalarını ve paketlerini yüklüyor
      Belki de gerçek bir luna88k üzerinde derlediği için uzun sürüyordur; her durumda bu kadarı OpenBSD’nin resmî donanım platformu olarak kalması için yeterli
      Ben şahsen bir luna88k sahibi olmak istemem ama bunu sürekli çalışır halde tutan kişiye gerçekten saygı duyuyorum
  • SDL sanki yeniden Loki dönemindeki köklerine dönüyor gibi

  • Harika
    Neden mi? Sebebini bilmesem de havalıysa yeter diyorum

    • Artık DOS üzerinde Dota 2 çalıştırabiliriz
    • Tarayıcı tabanlı DOSBox o kadar kolay ve hızlı çalışıyor ki DOS, küçük oyunlar kadar oldukça ciddi oyunları da taşıyabilen taşınabilir bir hedef platform hâline geliyor
      Internet Archive’da görüldüğü gibi klavye ve fare varsa, 90’ların ortasındaki AAA düzeyinde karmaşıklığa kadar olan şeyler pratikte neredeyse her yerde çalıştırılabiliyor
      Tomb Raider, Command & Conquer, Quake gibi oyunlar buna örnek ve sadece çalışan bir platform istiyorsanız oldukça cazip
      Buna bir de SDL eklenince iş çok daha kolaylaşıyor
    • FreeDOS, teknik açıdan bakınca bugün bile aktif olarak desteklenen modern bir DOS
    • SDL çapraz platformlu bir multimedya kütüphanesi ve DOS da bir platform
  • Gerçekten sevindim
    Bu beni çok mutlu ediyor