← bitàcola

Fase 1: píxels a la pantalla

El primer que va fer rumb va ser posar una pàgina web dins d'una finestra de GPUI, i ho va fer de la manera més tosca que podia funcionar.

Servo es construeix amb un context de render fora de pantalla — un context de GPU real fet a partir del handle de display de l'amfitrió, però amb una superfície que ningú no compon, de manera que GPUI conserva la propietat del drawable que la pantalla mostra de debò. A cada tick de render fèiem girar el bucle d'esdeveniments de Servo, dèiem al WebView que pintés i després cridàvem read_to_image sobre aquell framebuffer fora de pantalla per tornar-nos els píxels a la memòria del sistema. Servo els lliura en RGBA i GPUI els vol en BGRA, així que intercanviàvem el vermell i el blau a mà per tot el buffer i passàvem el resultat a paint_image com si fos una imatge que algú hagués carregat del disc.

Era lent exactament de la manera que t'esperes: una anada i tornada completa per la CPU, un cop per fotograma, per a uns píxels que no havien sortit mai de la targeta. El ritme dels fotogrames sortia només de request_animation_frame i les actualitzacions a pantalla es quedaven pels volts d'1 Hz. El redimensionament no estava connectat. A la pàgina no hi arribava cap entrada.

Tot això ja ho sabíem quan ho vam escriure. La idea no era tenir un camí ràpid, sinó descobrir si Servo s'arribaria a incrustar en una aplicació de GPUI — si els dos bucles d'esdeveniments podien compartir procés, si els malabars amb els contextos aguantaven, si per l'altre costat en sortia una pàgina. Quan en va sortir una, la pregunta va deixar de ser «això és possible?» i va passar a ser «com evitem que el fotograma toqui la CPU?», que és un lloc molt millor on quedar-se encallat. El readback no estava pensat per sobreviure al contacte amb la fase 2.

GPU SYSTEM MEMORY Servo offscreen framebuffer GPUI paints read_to_image every frame copy, then R↔B swap upload as a texture a full round trip, per frame
El framebuffer de Servo fa un viatge d'anada i tornada per la memòria del sistema i un intercanvi de color abans que GPUI el pugui dibuixar.