Ulep w Xboksie 360, czyli klimat kina szpiegowskiego, wkurzony Kutaragi i średniawka na koniec
PlayStation 3 i jego procesor Cell, mimo upływu ponad dwóch dekad od ich pierwszej publicznej prezentacji, wciąż wśród wielu graczy wzbudzają swoistą fascynację. Szalenie skomplikowana, w dodatku uderzająca w paradygmat projektowania gier jednostka, stała się swoistym symbolem odwagi, jaką musieli cechować się inżynierowie u początku ery HD. Po latach wiemy, że Sony – wraz z partnerami z Toshiby i IBM – zabrnęli wówczas w ślepą uliczkę, ale legenda mocy Cella pozostaje żywa. Co innego w przypadku układu Xenon montowanego w Xboksie 360, który, niewykorzystywany przesadnie w domenie marketingowej, przeszedł właściwie bez większego echa. Tymczasem jego historia wcale nie jest mniej interesująca, a spuścizna - trochę paradoksalnie - pozostaje wyczuwalna do dzisiaj.
Na początek – właśnie historia, ale poprzedzająca czasy Xboksa 360. Znajdując około 24 mln nabywców, pierwszy Xbox, mimo iż z kretesem przegrał rywalizację z PS2 (155 mln), przetarł szlaki Microsoftu w roli firmy zajmującej się nie tylko oprogramowaniem dla zgorzkniałych urzędasów, ale też grami wideo. Był jednak produktem, delikatnie mówiąc, ekonomicznie nieprzemyślanym. Niedoświadczony w segmencie rozrywki Microsoft, dążąc do możliwie szybkiego debiutu, wziął najważniejsze komponenty z półki od Intela oraz Nvidii. Procesor Pentium III oraz grafika GeForce NV2A pozwoliły zostawić konkurencję w tyle na polu mocy obliczeniowej, ale były niewspółmiernie drogie w odniesieniu do tego, co zamawiali Sony, Nintendo bądź Sega. Dość powiedzieć, że przy wycenie detalicznej konsoli na poziomie 299 dolarów amerykańskich, spółka z Redmond za produkcję jednej sztuki płaciła około 425 dolarów. Co gorsza, kwota ta nie malała w czasie, gdyż dostawcy wyszli z założenia, że czynnikiem decydującym jest nie staż oferowanych podzespołów, lecz ekwiwalent, jaki w swej ocenie mogliby uzyskać poświęcając linie produkcyjne na inne, nowsze chipy.
Awantura z Nvidią i sceptyczny szef Intela
Taki hiper kapitalizm w podejściu partnerów błyskawicznie doprowadził do otwartego konfliktu pomiędzy Microsoftem a Nvidią. Już w 2022 roku spółki weszły na drogę arbitrażu sądowego, gdyż ich pierwotnie zawarta, bardzo sztywna umowa, zaczęła być przez obie strony kwestionowana. Gigant graficzny skarżył się, że sprzedaż konsol jest niższa niż obiecywano, przez co utrzymywanie linii dla starzejącego się wówczas w bardzo szybkim tempie układu NV2A – czyli de facto GeForce’a 3 - generuje straty. Ludzie Billa Gatesa ripostowali, że to właśnie zawyżona cena ogranicza zainteresowanie. W pewnym momencie byli nawet skłonni oddać produkcję innemu podwykonawcy, ale w obliczu należącej do Nvidii własności intelektualnej prawnie nie było takiej opcji. Ostatecznie przedsiębiorstwa jakoś się porozumiały, ale ich przepychanka będzie mieć bardzo poważne konsekwencje. Projektując X360, Microsoft już nie wspomni o Zielonych i uśmiechnie się do ATI.
Co ciekawe, Intel kredyt zaufania dostanie nieco większy, ale to nie kwestia sympatii, lecz obaw o brak alternatywy. AMD wprawdzie na początku XXI wieku miało w ofercie doceniane przez graczy układy z serii FX-50, ale obawiano się – bardzo słusznie – że czasy procesorów jednordzeniowych dobiegają końca. Do tego, mimo relatywnie ograniczonego udziału w rynku komputerów, szacowanego w tamtych czasach na 15-20%, jako firma zdecydowanie mniejsza od niebieskiej konkurencji często zmagało się z trudnościami produkcyjnymi i logistycznymi. Jay Allard, jeden z liderów projektu X360, przyzna po latach, że pomysł na wykorzystanie w konsoli Athlona zniknął niemal tak szybko, jak się pojawił. Microsoft nie zamierzał ryzykować powierzenia projektu ludziom, którzy w dziedzinie podwykonawstwa na masową skalę byli żółtodziobami, a AMD – zamiast klepać konsumencką masówkę - wolało zachować ograniczone moce produkcyjne na potrzeby segmentów wysokomarżowych, takich jak serwery.
Na nieszczęście Jaya Allarda i jego ludzi, Intel, mimo swoistej autostrady do zawarcia transakcji, w ogóle się do niej nie pchał. Ówczesny szef procesorowego giganta Craig Barrett nie traktował rozrywki jako samodzielnego filaru biznesowego, a jedynie jedną z funkcji, które mogą – i wcale nie muszą – dostarczać ludziom PC-ty. Gaming wielokrotnie nazywał „efektem ubocznym” rozwoju komputerów, a swoistym pokłosiem jego podejścia były procesory Pentium 4 w kontrowersyjnej architekturze NetBurst. Cechujące się niskim IPC, czyli liczbą instrukcji wykonywanych w cyklu zegara, musiały nadrabiać wysokim taktowaniem. W rezultacie, by zachować konkurencyjność, zużywały masę energii i równie pokaźnie się nagrzewały, co z kolei dyskwalifikowało je w roli serca smukłej konsoli, przeznaczonej do postawienia w ciasnej szafce pod telewizorem. Lekceważący rynek gier Barrett, pomimo nawoływań, nie zamierzał siadać z Microsofftem do deski kreślarskiej w celu zbudowania lepiej zoptymalizowanej alternatywy. Tym bardziej, że prawa do takiego układu zostałyby podzielone, a biznesmen miał z tyłu głowy obawy o utratę przez Intela rynkowej dominacji.
Na ratunek ulep od IBM
W tle był jednak ktoś, kto doświadczenie z grami wideo już miał, bo tworzył procesor do GameCube’a. Nie bał się też optymalizować chipów pod bardziej multimedialne niż czysta arytmetyka zadania. Wprowadził pierwszy konsumencki CPU z 64-bitowymi rejestrami, a dzięki rozszerzeniom wektorowym, bił rywali na głowę w takich zastosowaniach jak renderowanie wideo czy obróbka muzyki. Rzecz jasna, chodzi o IBM. Patrząc z perspektywy twórców konsoli, wyspecjalizowanego sprzętu do grania, referencje Big Blue wydawały się spełnieniem marzeń. Był tylko jeden problem, a mianowicie nowojorski potentat był już zaangażowany w prace nad konkurencyjnym PlayStation 3, tworząc – obok Sony i Toshiby – konsorcjum STI. Oprócz tego, jako że mnóstwo czasu stracono na bezowocne dyskusje z Intelem, odczuwalna zaczęła być presja kalendarza. Xbox 360 miał trafić na rynek w 2005 roku, a zamknięcie wątku Pentium datuje się na rok 2003. Nie trudno zauważyć, że czasu na stworzenie układu od zera nie było. Znowu zapachniało gotowcem.
O dziwo, gdy inżynierowie Nick Baker i Jeff Andrews stanęli w drzwiach IBM, nikt nie odesłał ich z kwitkiem. Wprost przeciwnie, wyzwanie podjęto, a do jego realizacji wyznaczony został niejaki David Shippy, Ten sam człowiek, który był głównym architektem Cella dla PS3, zaczął jednocześnie czuwać nad głównym rywalem konsoli Sony, Xboksem 360. Już sama koincydencja ról może budzić pewne pytania, ale Shippy poszedł o krok dalej. Rdzeń PPE z Cella, układ zgodny z modelem programowym PowerPC v2.02, który w projekcie dla Japończyków pełnił rolę modułu zarządzającego wektorowymi koprocesorami SPE, inżynier wyodrębnił, by zrobić z niego samodzielny chip. W sumie w obrębie jednego kawałka krzemu zastosował trzy takie rdzenie, więc ostatecznie PlayStation 3 otrzymało dość niekonwencjonalne połączenie jednordzeniowego CPU i siedmiu pomocniczych podukładów wektorowych, a Xbox 360 – bardziej klasyczny procesor trzyrdzeniowy.
Jak pewien inżynier zabawił się w kino szpiegowskie
IBM początkowo utrzymywał współpracę z ekipą Windowsa w ścisłej tajemnicy, o czym szeroko pisze Shippy w swojej książce pt. „The Race for a New Game Machine”. Warto podkreślić, niektóre przedstawiane przez inżyniera rozwiązania mogłyby aspirować do filmu szpiegowskiego. Ludzie pracujący przy obydwu projektach byli konsekwentnie separowani – wyjaśnia Shippy. Doszło do tego, że w biurze wstawiano specjalne ścianki działowe, a personel pod rozmaitymi pretekstami dostawał nakaz ukrywania dokumentów czy monitorów przed kolegami i koleżankami. Wodzone za nos było również samo Sony, którego przedstawicielom wmawiano, że ewentualne rozszerzenia funkcjonalności rdzenia PPE powstają na rzecz serwerów marki Apple. Trochę paradoksalnie, prawdopodobnie również przez intrygę sprytnego inżyniera wywnioskowano, że zainteresowanie Cellem jest większe, niż było w istocie. Na konferencjach poprzedzających debiut PS3 niczym mantrę powtarzano wątek zastosowania układu w serwerach, a także przemyśle filmowym.
Ciekawostka na marginesie: chyba jedyną firmą, która wykorzystała Cella konsumencko, obok Sony, jest Toshiba i nie był to kompletny procesor, lecz - niejako dla kontrastu wobec adaptacji PPE przez Microsoft - układ składający się z samych SPE. Koprocesor do PC-tów zwany SpursEngine, bo o nim tu mowa, wykorzystywał cztery samodzielne SPE, by przyspieszyć przetwarzanie i konwersję wideo w czasach przed ekspansją Nvidia CUDA i idei GPGPU. Leadtek Winfast, jeden z ówczesnych liderów wśród dostawców grafik, na jednym laminacie połączył kwartet SpursEngine. Rozwiązanie trafiło ponadto do kilku laptopów, w tym Qosmio G50 oraz F50. Dość szybko jednak musiało ustąpić rosnącym jak na drożdżach, zdecydowanie bardziej elastycznym kartom graficznym Nvidia GeForce oraz ATI Radeon.
Ale wróćmy do meritum. Jak głosi stare porzekadło, kłamstwo ma krótkie nogi. Również chytry plan Shippiego musiał kiedyś wyjść na jaw, a gdy to się stało, Ken Kutaragi, traktujący Cella jak swoje opus magnum, przeszedł ponoć totalne załamanie. Jak przedstawił po latach blogger technologiczny Rodrigo Copetti, lider projektu PS3 miał alienować się od ludzi, tracić zaufanie do najbliższych współpracowników i scenicznie wykrzykiwać o zdradzie. Na nieszczęście Japończyka, a ku uciesze Amerykanów, złość na niewiele się zdała. Sony bowiem w umowie podpisanej z IBM wyraźnie dopuściło udostępnienie elementów swojego rewolucyjnego CPU firmom trzecim, co prawnicy Big Blue błyskawicznie wychwycili. Inna sprawa, że sam Kutaragi, pozostawiając tego rodzaju furtkę, liczył na rozwijający się wówczas rynek serwerów; centra danych, farmy obliczeniowe itd. Bezpośredniej konkurencji raczej w jego wyliczance nie było. Zatem, wyszło bez wątpienia niezręczne, ale zgodnie z literą prawa.
Dobrze, czyli przede wszystkim szybko i tanio
Bądź co bądź, czas leczy rany. Protesty ucichły, a Microsoft dostał to, czego chciał. Dedykowany procesor centralny dla konsoli do gier siódmej generacji, który wedle ówczesnej oceny spełniał wszelkie postawione przed nim wymogi. Miał trzy rdzenie i dzięki wsparciu dla wielowątkowości symultanicznej SMT, aż sześć wątków, w pierwszej generacji wydzielając przy tym około 50 W ciepła. Nawet dwukrotnie mniej niż topowe Pentium 4 ze rdzeniami Prescott. Modyfikacje wprowadzone za namową spółki z Redmond objęły zaś dodanie 1 MB współdzielonej pamięci podręcznej L2 i wektorowej jednostki VMX128 dla każdego rdzenia, będącej wariacją na temat promowanego wówczas przez IBM zestawu rozszerzeń AltiVec. Wprawdzie przy jednakowym dla obu układów - Xenon oraz Cell - taktowaniu, równym 3,2 GHz, teoretyczna moc obliczeniowa konstrukcji dla Sony wciąż pozostawała znacząco wyższa - 153,6 vs 115,2 GFLOPS - jednak to dotyczy scenariusza z pełnym wykorzystaniem potencjału sześciu oddelegowanych do gier SPE, co jak wiemy, nie zdarzało się często. Gdy deweloper zechciał przenieść kod z Xboksa 360 na PS3 w sposób bezpośredni, miał do dyspozycji raptem około piątą część szczytowego potencjału.
Ale czy IBM Xenon był procesorem dobrym? Strzelam, że na tak postawione pytanie większość graczy odpowie twierdząco. W końcu tytuły multiplatformowe nie bez kozery działały lepiej w obozie Billa. Tylko, to wcale nie jest takie proste. Jay Allard i jego zespół, idąc na skróty, trochę przypadkiem wpisali się w kanon projektowania gier siódmej generacji, bo pomysł na umieszczenie w układzie kilku symetrycznych rdzeni z marszu przyjęły także PC-ty. Kiedy natomiast wśród blaszaków spopularyzowane zostały zunifikowane jednostki obliczeniowe w kartach graficznych, wszelkie efekty post-produkcji, symulacje deformacji materiałów czy optymalizacji siatki - a więc to, czym trudnił się Cell - trafiły na barki GPU. Summa summarum przewaga Xenona, bardziej niż z jego bezwzględnych walorów, wynikała z przyjętego paradygmatu programowania.
Grzechy główne IBM Xenona
Jeśli musiał wykazać się w skali bezwzględnej, to zazwyczaj nie dowoził, a koronnym przykładem jest tu obsługa 10 MB pamięci podręcznej eDRAM, na której próbowano oprzeć bufor ramki 360-tki. Rozwiązanie to, formalnie wynikające z budowy podsystemu graficznego, miało na procesor Xenon niespodziewanie duży wpływ. Trudno powiedzieć, czy to błędne obliczenia czy bardziej dusigrosze z księgowości, ale fakt jest taki, że pula pamięci była zbyt mała. Ramka w rozdzielczości 720p z 4-krotnym MSAA, 32-bitowym kolorem i buforem głębi - co sugerowano w dokumentacji jako target Xboksa 360 - waży 12,5 MB. Twórcy musieli tym samym albo ciąć rozdzielczość, jak w Halo 3 działającym w 1152x640 px, albo stosować tzw. kafelkowanie. Czyli dzielić każdą scenę na kawałki, zazwyczaj dwa lub trzy, a następnie łączyć te fragmenty w systemowej pamięci GDDR3. Problem w tym, że składanie kafelków wymagało bardzo precyzyjnego zarządzania czasem - eDRAM miał przepustowość 256 GB/s, a GDDR3 22,4 GB/s - i szeregu operacji na samej pamięci. Generowało to narzut na procesor centralny i magistralę w stopniu, którego inżynierowie odpowiedzialni za projekt konsoli raczej nie brali pod uwagę. Na domiar złego, nie pomagała specyficzna architektura pamięci w konsoli, do której Xenon nie miał dostępu bezpośredniego. Musiał wykorzystywać w torze komunikacji GPU, bezpośrednio wyposażone w kontroler. Mieliśmy więc: niezbyt szybki procesor Xenon, pamięć GDDR3 o wysokich z natury opóźnieniach, dalszą latencję w torze komunikacji procesora z pamięcią i konieczność intensywniejszego niż zazwyczaj wykonywania operacji na pamięci. Połączenie cokolwiek intrygujące, przyznajcie.
Sam procesor Xenon, wyrzeźbiony z fragmentu Cella, wielu potrzeb gamingu ery HD zwyczajnie nie adresował. Nie umiał wykonywać poza kolejnością, stąd wymagał od programistów ścisłego trzymania się struktury kodu. Jeśli natrafił na instrukcję nieobecną w cache'u i musiał czekać na wolną pamięć GDDR3, płynność rozgrywki od razu dostawała młotem obuchowym. Jakby tego było mało, ulep od IBM fatalnie - nawet w odniesieniu do innych układów z epoki - radził sobie z przewidywaniem rozgałęzień. Wyjaśniając najprostszymi możliwymi słowami, gry mają zawsze tysiące instrukcji warunkowych. Weźmy za przykład oddanie strzału z wirtualnej broni. Jeśli ten jest celny, trafienie należy zaliczyć i odebrać wrogowi punkty życia, odwrotnie w przypadku strzału niecelnego. Przewidywanie polega na tym, że jeśli gracz oddaje serię i w jednej klatce trafia, to procesor ma podstawy, by przyjąć, że w kolejnej stanie się to samo. Może więc zawczasu pobrać kolejne rozkazy i rozpocząć ich dekodowanie, by zając się następnym zadaniem. Niestety kiedy dojdzie do pomyłki, cały potok musi zostać wyczyszczony, a to generuje oczywiście opóźnienia. Dla wydajności krzemowego serca Xboksa 360, które samo w sobie nie było zbyt potężne, a jeszcze musiało kleić zbyt mały bufor ramki, było to druzgocące.
Szeroko stosowana w projekcie improwizacja nie pomagała. Na przykład 128-bitowe instrukcje wektorowe, obecne w ramach rozszerzenia VMX128, które miały szansę pozytywnie wpłynąć na złożoność logiki gier, nie mogły być pisane w języku C czy C++. Xenon takowych nie rozumiał i programistom pozostawał jedynie skomplikowany assembler. W teorii Microsoft udostępniał obsługiwane przez kompilator intrinsics, biblioteki Xbox Math/XNAMath, rozbudowany XDK oraz narzędzia profilujące, ale narzekano na ich jakość i dokumentację. Spółce zarzucano, że dostarcza papierologię rozszerzenia IBM AltiVec, podczas gdy Xbox 360 miał jego mocno zmodyfikowaną wersję, usuwającą choćby niektóre formy mnożenia i dodającą 128-bitowe, zamiast 32-bitowych, rejestry. Opisy tworzyli deweloperzy, metodą prób i błędów. I albo im się udało, albo gra stawała się technologicznym koszmarem. Niczym Far Cry 3, który przy każdej scenie bogatszej w symulacje fizyczne, spadał do poziomu 15-20 fps. Odpowiednie wykorzystanie VMX128 mogłoby komfort zabawy wydatnie poprawić, ale - z jakiegoś powodu - nikt do tego nie przysiadł.
Xboksa 360 w istocie rzeczy premiowało lenistwo deweloperów, bo gdy ktoś zechciał uruchomić dokładnie ten sam kod na urządzeniach Microsoftu i Sony, to miał do dyspozycji nie jeden, ale trzy rdzenie, a do tego dwukrotnie więcej pamięci podręcznej L2 - 1 MB zamiast 512 KB. Uwzględniając obecność SMT, dawało to nie dwa, lecz sześć procesorów logicznych. Musząc zachować odpowiednią strukturę kodu, na oba chipy pisało się jednak zauważalnie trudniej niż w przypadku ich dzisiejszych odpowiedników, a zgodność Xenona z PC-towym wzorcem wielowątkowości dawała mu przewagę wyłącznie w przestrzeni koncepcji, ale już nie dokładnej realizacji programów. Tymczasem jeśli programiści zechcieli poświęcić więcej czasu, wgryźć się w architekturę i stworzyć kod niejako na wymiar, to Cella się dusić dawało, natomiast z Xenona nie zawsze było co wyciskać.
XCGPU: cicha zapowiedź zmian
Co ciekawe, Xenon, mimo swych licznych wad, w końcu doczekał się też rozwiązania, które dzisiaj na rynku konsol stanowi absolutny standard. Otóż w 2010 roku, razem z układem grafiki ATI Xenos i pamięcią eDRAM, stał się XCGPU, czyli de facto pierwszym na świecie wysokowydajnym chipem łączącym procesor i kartę graficzną w jedno - SoC. Przydała się tu niewątpliwie wynegocjowana w umowie przez Microsoft możliwość modyfikacji pierwotnego projektu, a w czasach gdy hitem technologicznym był Clarkdale Intela, którego układ graficzny pozwalał co najwyżej na wyświetlenie pulpitu, zaprezentowane rozwiązanie mogło uchodzić za technologiczny majstersztyk. Zwłaszcza, że integracja CPU, GPU i eDRAM to nie tylko przylutowanie wszystkich komponentów do jednej płytki (substratu). W ustandaryzowanej specyfikacji Xboksa 360 trzeba było zadbać również o to, by wszystkie układy komunikowały się wzajemnie z dokładnie taką samą szybkością jak w oryginale, gdzie korzystały z konwencjonalnej szyby FSB.
By kanał wymiany danych, po zbliżeniu do siebie komponentów, nie był zbyt szybki, zastosowano unikatowy moduł opóźniający. Więc tak, Xbox 360 S z płytą główną Trinity i wszystkie późniejsze modele mogły być wydajniejsze od oryginału, ale w pełni intencjonalnie zostały spowolnione. Tymczasem ostatecznie, pod sam koniec życia konsoli, integracja pójdzie jeszcze dalej. Oferowany w latach 2014-15, już po premierze Xboksa One, wariant E z płytą Winchester otrzyma nie 45-, lecz 32-nanometrowy SoC. Obecna w nim pamięć eDRAM zostanie wklejona w zasadniczy krzem, tak, jak odbywało się to w przypadku chipu Xboksa One właśnie. Finał historii Xenona jest w rezultacie niezwykle fascynujący. Klejony na szybko procesor, silnie ugruntowany w rozwiązaniach konkurencji, stanie się swoistym wyznacznikiem rozwoju konsol na kolejne lata, a jego spuścizna obejmie nie tylko PS4 oraz XO, ale też PS5 oraz Xboksy Series. Przynajmniej w kwestii makroarchitektury, bo mikro-, to - jak już zostało powiedziane - inna para kaloszy.
Rozdarty pomiędzy starym a nowym
Żeby też oddać sprawiedliwość inżynierom oraz programistom, kwestia optymalizacji pod specyficzne procesory konsol siódmej generacji zdaje się być problemem szerszym niż błędy popełnione przy projektowaniu konkretnych kawałków krzemu, czy później przy pisaniu na nie gier. Zarówno tytułowy Xbox 360, jak i często przytaczane przeze mnie PlayStation 3, jako preludium do ery gamingu HD, sporo rozwiązań musiały założyć w ciemno. Standardów w tamtym czasie nie było. Pech chciał, że wypracowane z biegiem czasu standardy znacząco odbiegały od tego, co producenci konsol przyjęli. Już w 2006 roku do sklepów trafiły procesory Intel Core 2 z rdzeniami Allendale i Conroe, z kultowym modelem E4300 na czele, przesuwając wajchę w stronę brutalnej siły przetwarzania liczb stałoprzecinkowych, optymalizacji przewidywania skoków czy architektury wykonywania poza kolejnością. Operacje masowo równoległe, pod które projektowane były Xenon oraz Cell, trafiły pod skrzydła GPU i nie było już powrotu.
Biorąc pod uwagę, że siódma generacja dzielnie służyła graczom aż do końcówki roku 2013, osoby odpowiedzialne za jej powstanie i tak mogą czuć się zawodowo spełnione. Zapewne historycznym fenomenem pozostanie również to, że w obrębie tylko jednego rzutu urządzeń mogliśmy doświadczyć przejścia od surowej grafiki 3D, ukrywającej niedostatki mrokiem i mgłą, do żywych światów z dynamicznym oświetleniem i fizyką materiałową w rolach głównych. Skok tego kalibru nie ma szans się powtórzyć i siłą rzeczy raczej nie powtórzą się też wyzwania projektowe towarzyszące X360 oraz PS3. To już jednak tematy na zupełnie inny tekst. Sam IBM, krytykowany za opóźnienia dostaw jeszcze w przededniu premiery PlayStation 3 stracił motor napędowy - kontrakt na dostawy chipów z Apple. Później na rynku konsol zdołał jeszcze tylko stworzyć procesor dla niezbyt udanego Nintendo Wii U (2012 r.), po czym rozdział rozrywkowy całkowicie zakończył. Dalej siedzi w scalakach, jednak wyłącznie klasy przemysłowej, napędzając m.in. superkomputery do sztucznej inteligencji, systemy chmurowe oraz finansowe mainframe'y. Program rozwoju procesora Cell i jego rozgałęzień zamknięto formalne w 2009 roku.
Przeczytaj również
Komentarze (4)
SORTUJ OD: Najnowszych / Najstarszych / Popularnych