Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Miten WebXR toimii Servossa

Terminologia

Servon WebXR-toteutus koostuu kolmesta pääkomponentista:

  1. Script-säie (ajaa kaiken JS:n sivulle)
  2. WebGL-säie (ylläpitää WebGL-canvas-datan ja kutsuu GL-operaatioita, jotka vastaavat WebGL API:ja)
  3. Compositor (eli pääsäie)

Lisäksi on useita WebXR-spesifisiä käsitteitä:

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:

  1. Jotakin alustusta tapahtuu pääsäieellä
  2. Pääsäie lähettää synkronisen viestin WebGL-säieelle
  3. WebGL-säie vastaanottaa viestin
  4. Backend-spesifistä, grafiikka-spesifistä alustusta tapahtuu WebGL-säieellä, layer manager factory -abstraktion takana
  5. Uusi layer manager tallennetaan WebGL-säieelle
  6. 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.