Miten WebXR toimii Servossa
Terminologia
Servon WebXR-toteutus koostuu kolmesta pääkomponentista:
- Script-säie (ajaa kaiken JS:n sivulle)
- WebGL-säie (ylläpitää WebGL-canvas-datan ja kutsuu GL-operaatioita, jotka vastaavat WebGL API:ja)
- Compositor (eli pääsäie)
Lisäksi on useita WebXR-spesifisiä käsitteitä:
- discovery object (eli miten Servo havaitsee, voiko laite tarjota WebXR-session)
- WebXR registry (compositorin rajapinta WebXR:ään)
- layer manager (hallinnoi WebXR-kerroksia tietylle sessiolle ja kehystoimintoja näillä kerroksilla)
- layer grand manager (hallinnoi kaikkia layer managereita WebXR-sessioille)
Lopuksi on grafiikkaan liittyviä käsitteitä, jotka ovat tärkeitä WebXR-renderöinnin matalan tason yksityiskohtien kannalta:
- Surfman on crate, joka abstrahoi alustakohtaiset yksityiskohdat OpenGL-laitteistokiihdytetystä renderöinnistä.
- surface on laitteistopuskuri, joka on sidottu tiettyyn OpenGL-kontekstiin.
- surface texture on OpenGL-tekstuuri, joka wrap:aa pinnan. Surface textureja voidaan jakaa OpenGL-kontekstien välillä.
- surfman context edustaa tiettyä OpenGL-kontekstia, ja sen taustalla on alustakohtaisia toteutuksia (kuten EGL Unix-pohjaisilla alustoilla).
- ANGLE on OpenGL-toteutus Direct3D:n päällä, jota Servo käyttää tarjotakseen yhtenäisen OpenGL-backendin Windows-alustoilla.
Miten Servon compositor käynnistyy
Upottaja on vastuussa ikkunan luomisesta ja renderöintikontekstin luonnin käynnistämisestä asianmukaisesti. Servo luo renderöintikontekstin luomalla surfman-kontekstin, jota compositor käyttää kaikkiin web-sisällön renderöintitoimintoihin.
Miten sessio käynnistyy
Kun verkkosivu kutsuu navigator.xr.requestSession(..) JS:n kautta, tämä vastaa Servon XrSystem::RequestSession -metodia.
Tämä metodi lähettää viestin WebXR-viestinkäsittelijälle, joka elää pääsäieellä compositorin hallinnassa.
WebXR-viestinkäsittelijä käy läpi kaikki tunnetut discovery objectit ja yrittää pyytää sessiota jokaiselta. Discovery objectit kapseloivat session luomisen jokaiselle tuetulle backendille.
Heinäkuun 19, 2024 tilanteessa on kolme WebXR-backendiä:
- headless - tukee ikkunatonta, laitteetonta laitetta automatisoiduille testeille
- glwindow - tukee GL-pohjaista ikkunaa manuaaliseen testaukseen työpöytäympäristöissä ilman oikeita laitteita
- openxr - tukee laitteita, jotka toteuttavat OpenXR-standardin
WebXR-sessioiden täytyy luoda layer manager jossain vaiheessa, jotta ne voivat luoda ja renderöidä WebXR-kerroksiin. Tämä tapahtuu useassa vaiheessa:
- Jotakin alustusta tapahtuu pääsäieellä
- Pääsäie lähettää synkronisen viestin WebGL-säieelle
- WebGL-säie vastaanottaa viestin
- Backend-spesifistä, grafiikka-spesifistä alustusta tapahtuu WebGL-säieellä, layer manager factory -abstraktion takana
- Uusi layer manager tallennetaan WebGL-säieelle
- Pääsäie vastaanottaa yksilöllisen tunnisteen uudelle layer managerille
Tämä säieiden välinen tanssi on tärkeä, koska renderöintiä suorittavalla laitteella on usein tiukat vaatimukset yhteensopivuudelle kaikille renderöintiin käytetyille WebGL-konteksteille, ja suurin osa GL-tilasta on havaittavissa vain säieellä, joka loi sen.
Miten OpenXR-sessio luodaan
OpenXR-discovery-prosessi alkaa OpenXrDiscovery::request_session -kohdasta. Discovery objectilla on pääsy vain siihen tilaan, joka välitettiin sen konstruktorissa, sekä SessionBuilder -objektiin, joka sisältää uuden session luomiseen tarvittavat arvot.
OpenXR-session luominen luo ensin OpenXR-instanssin, joka mahdollistaa käytössä olevien laajennusten konfiguroinnin. Eri alustoilla OpenXR:n alustukseen käytetään eri laajennuksia; Windowsilla käytetään XR_KHR_D3D11_enable extension, koska Servo luottaa ANGLEen OpenGL-toteutuksessaan.
Kun OpenXR-instanssi on olemassa, session builderia käytetään uuden WebXR-session luomiseen, joka ajaa omassa säieessään. Kaikki WebXR-sessiot voivat joko ajaa säieessä tai Servo voi ajaa ne pääsäieellä. Tällä valinnalla on vaikutuksia siihen, miten WebXR-session grafiikka voidaan konfiguroida, sen perusteella, mitä GL-tilaa täytyy olla saatavilla jaettavaksi.
OpenXR:n uusi session-säie alustaa OpenXR-laitteen, joka on vastuussa varsinaisen OpenXR-session luomisesta. Tämä session-objekti luodaan WebGL-säieellä osana OpenXR layer managerin luomista, koska se luottaa WebGL-säieen käyttämän GPU-laitteen jakamiseen.
Kun session-objekti on luotu, pääsäie voi hankkia kopion ja jatkaa uuden laitteen jäljellä olevien ominaisuuksien alustusta.