Prędkość szyny, chipsetu oraz operacji na CHIP-RAM nie będą się różnić. Taktowanie cykli DMA jest dokładnie takie samo (o ile pamiętam to 3,54MHz) i różnice w wynikach testów mogą wynikać jedynie z obciążenia DMA i ilości slotów, które są w danym momencie do dyspozycji CPU.
Co do bufora w A4000 to możliwe, że to było faktycznie tylko na kartach CyberStorm, a nie w samej architekturze A4000 - jak odszukam źródło tej informacji to się podzielę.
Co do samego pomysłu na write buffer do pamięci CHIP-RAM - to w żadnym wypadku moją intencją nie było przekonywanie, że to jakoś przyspieszy operacje na samej pamięci CHIP-RAM, ale to czego jestem pewien to na pewno pozwoliłoby to rozwinąć skrzydła procesorowi 060 w trybie AGA.
Postaram się to wytłumaczyć na uproszczonym przykładzie efektu 3D pod 060+AGA ze wskazaniem jakie zasoby są w danym kroku wykorzystywane i jak wygląda utylizacja CPU, przy następujących założeniach:
- efekt działa z prędkością 25 FPS (idealne warunki - stałe FPS)
- działamy wg 'nowożytnego' podejścia, czyli robimy C2P FAST-RAM->FAST-RAM i tylko kopiujemy do CHIP-RAM (ogólnie kopiowanie odbywa się przy wyłączonym DMA bitplane'ów i jest rozbite na kilka ramek - w dużym uproszczeniu można powiedzieć, że kopiowanie do CHIP-RAM odbywa się tylko podczas VBLANK - ale dla tego przykładu to pomijam bo to by mocno skomplikowało)
- czasy poszczególnych kroków podane w nawiasach są przykładowe, żeby mniej więcej pokazać proporcje ile na co potrzeba czasu i podane są w 'ramkach', a 1 ramka to oczywiście 1/50 sekundy
- celowo pomijam double buffer dla bitplane'ów, co w rzeczywistości jest tylko zmianą adresu w pamięci CHIP-RAM pod który kopiowane są dane bufora plannar
1. RenderFrame (1 ramka) - CPU czyta z FAST-RAM, wykonuje obliczenia, zapisuje do FAST-RAM (bufor chunky)
2. C2P (krok 1 - konwersja) (0.25 ramki) - CPU czyta z FAST-RAM (bufor chunky), wykonuje konwersję, zapisuje do FAST-RAM (bufor plannar)
3. C2P (krok 2 - kopiowanie) (0.75 ramki) - CPU czyta z FAST-RAM, zapisuje do CHIP-RAM
4. GOTO 1
W krokach 1 i 2 utylizacja CPU i szyny do FAST-RAM na 100%.
Natomiast krok 3 w uproszczonym rozkładzie na operacje wyglada tak:
1. CPU czyta komórkę FAST-RAM do rejestru
2. CPU czeka na wolny slot DMA (CPU stalled)
3. CPU zapisuje dane z rejestru do wystawionego slotu DMA
4. DMA zapisuje dane ze slotu do pamięci CHIP-RAM (CPU stalled)
5. CPU dostaje potwierdzenie zapisu danych do pamięci CHIP-RAM
6. GOTO 1
W momencie kiedy CPU komunikuje się z DMA, nie działa architektura superscalar i wszystkie te operacje są wykonywane sekwencyjnie.
W kroku 1 można odczytać dane do kilku rejestrów jednocześnie, ale kroki 2-5 i tak będą wykonywane sekwencyjnie jeden po drugim dla każdego rejestru więc celowo to uprościłem w tym przykładzie.
A teraz do rzeczy...
Ideą write buffera CHIP-RAM jest pozbycie się bezpośredniej komunikacji CPU z DMA przez zastąpienie powyższych kroków 2-5 jedną operacją zapisu do write buffera, który byłby widoczny dla CPU w taki sam sposób jak FAST-RAM (w przypadku WARP'a z 0 wait state, dzięki kolejkowaniu zapisów do DDR).
Po takiej zmianie krok 3 w uproszczonym rozkładzie na operacje wyglada tak:
1. CPU czyta komórkę FAST-RAM do rejestru
2. CPU zapisuje dane z rejestru do write buffera CHIP-RAM
3. GOTO 1
Jako że nie ma bezpośredniej komunikacji z DMA pozbywamy się wszystkich stalli CPU i wtedy nasz efekt wygląda tak:
1. RenderFrame (1 ramka) - CPU czyta z FAST-RAM, wykonuje obliczenia, zapisuje do FAST-RAM (bufor chunky)
2. C2P (krok 1 - konwersja) (0.25 ramki) - CPU czyta z FAST-RAM (bufor chunky), wykonuje konwersję, zapisuje do FAST-RAM (bufor plannar)
3. C2P (krok 2 - kopiowanie) (0.25 ramki) - CPU czyta z FAST-RAM, zapisuje do write buffera CHIP-RAM
4. GOTO 1
Odzyskujemy 0.5 ramki, w których de facto nasze ulubione 060 i tak nic nie robiło bo czekało na DMA, które możemy spożytkować na bardziej wyrafinowany RenderFrame, albo przynajmniej mieć pewność że dzięki temu odzyskanemu czasowi nasz efekt będzie chodził ze stałą prędkością 25FPS, a nie 'szarpał' od czasu do czasu jak to zwykle się dzieje gdy jedziemy z timingami po bandzie.
W praktyce czas potrzebny na C2P może być jeszcze mniejszy niż te łączne 0.5 ramki - kiedyś liczyłem i z tego co pamiętam wychodziło mi, że samo C2P FAST-RAM->FAST-RAM na 060, Amiga jest w stanie wykonywać z prędkością ok. 200 FPS czyli właśnie 0.25 ramki - więc mając write buffer do CHIP-RAM odpowiedniej wielkości, zachowujący się jak pamięć FAST-RAM można by wrócić do robienia C2P klasycznie czyli konwersja z zapisem bezpośrednio do write buffera CHIP-RAM i zmieścić cały C2P (konwersja + bezpośredni zapis) w 0.25 ramki.
Pozostaje kwestia kiedy dane planarne przechowywane w write bufferze w rzeczywistości trafią do CHIP-RAM żeby układ graficzny mógł je wyświetlić. To oczywiście musi się dziać asynchronicznie i nawet niech sobie trwa te 0.75 ramki - to nie wpłynie na płynność działania efektu bo i tak na wyrenderowanie jednej klatki efektu potrzebne jest 1.5 ramki. A w szczegółach od zakończenia zapisu do write buffera danych klatki 1 do rozpoczęcia zapisu do write buffera danych klatki 2 upłynie minimum 1.25 ramki w tym przypadku, więc jeśli bufor jest odpowiedniej wielkości np. 64KB (czyli pomieści 320x200 8bit w palecie indeksowanej) to nie ma co się martwić o jego przepełnienie. Oczywiście najlepiej jakby bufor był wielkości 128KB bo wtedy to i 320x200 w 18bit true color (czyli 640x200 HAM8) dałoby się przez niego przepychać.
Na koniec... Uważam, że przy tym rozwiązaniu nie są potrzebne żadne dodatkowe rejestry na karcie czy przerwania mówiące o stanie write buffera CHIP-RAM. Nie grozi nam żaden tearing. Wszystko to kwestia odpowiedniego zakodowania efektu

(HINT: double plannar buffer w FAST-RAM + stary dobry Copper'owy double buffering danych skopiowanych do CHIP-RAM)
Zastosowanie mechanizmu tego typu, nie wymaga żadnych ingerencji w chipset Amigi, a mogłoby w rzeczywistości 'upłynnić' wiele demek 060+AGA i w ostatecznym odbiorze użytkownika zbliżyć je wydajnościowo do 060+RTG lub Falcona, jako że na RTG czy Falconie demka też nie chodzą w 50 FPS, ale działają płynniej - bo CPU przez cały czas jest utylizowane na 100%, a tylko wtedy jest w stanie pokazać na co faktycznie go stać, a nie wtedy gdy przez ok. 35% czasu renderowania klatki CPU jest stalled czekając na operacje DMA...
Ostatnia aktualizacja: 18.04.2019 20:24:36 przez dante