Das W3C-Konsortium hat die ersten Entwurfsversionen der WebGPU- und WebGPU Shading Language (WGSL)-Spezifikationen vorgestellt, die APIs für die Ausführung von GPU-Operationen wie Rendering und Berechnungen sowie eine Shading-Sprache zur Erstellung von Programmen, die auf der GPU ausgeführt werden, definieren. Konzeptionell ähnelt es den APIs Vulkan, Metal und Direct3D 12. Die Spezifikationen wurden von einer Arbeitsgruppe erstellt, die Ingenieure von Mozilla, Google, Apple und Microsoft umfasst.
Konzeptionell unterscheidet sich WebGPU von WebGL ähnlich, wie der Grafik-API Vulkan von OpenGL abweicht, jedoch basiert es nicht auf einem bestimmten Grafik-API, sondern stellt eine universelle Schicht dar, die dieselben Low-Level-Primitiven wie Vulkan, Metal und Direct3D verwendet. WebGPU bietet JavaScript-Anwendungen die Möglichkeit, eine niedrige Kontrolle über die Organisation, Verarbeitung und Übertragung von Befehlen an die GPU, das Management von zugehörigen Ressourcen, Speicher, Puffer, Texture-Objekte und kompilierte Grafik-Shader zu übernehmen. Ein solcher Ansatz ermöglicht eine höhere Leistung grafischer Anwendungen durch reduzierte Overheadkosten und verbesserte Effizienz im Umgang mit der GPU.
WebGPU ermöglicht die Erstellung komplexer 3D-Projekte für das Web, die nicht schlechter sind als eigenständige Programme, die direkt mit Vulkan, Metal oder Direct3D kommunizieren, jedoch nicht an bestimmte Plattformen gebunden sind. WebGPU bietet auch zusätzliche Möglichkeiten beim Portieren nativer Grafikprogramme in eine Form, die in Web-Technologien funktionieren kann, dank der Kompilierung in WebAssembly. Neben 3D-Grafik deckt WebGPU auch Möglichkeiten ab, die mit dem Auslagern von Berechnungen auf die GPU-Seite und der Ausführung von Shadern verbunden sind.
Wichtige Merkmale von WebGPU:
- Getrennte Verwaltung von Ressourcen, Vorbereitungsarbeiten und der Übertragung von Befehlen an die GPU (in WebGL war ein Objekt für alles verantwortlich). Es werden drei separate Kontexte bereitgestellt: GPUDevice zur Erstellung von Ressourcen wie Texturen und Puffern; GPUCommandEncoder zur Kodierung einzelner Befehle, einschließlich Rendering- und Berechnungsphasen; GPUCommandBuffer zur Übertragung in die Warteschlange zur Ausführung auf der GPU. Das Ergebnis kann in einem Bereich gerendert werden, der mit einem oder mehreren Elementen canvas verknüpft ist, oder ohne Ausgabe verarbeitet werden (z. B. beim Ausführen von Berechnungsaufgaben). Die Trennung der Phasen erleichtert die Aufteilung der Erstellung von Ressourcen und die Vorbereitungsoperationen in verschiedene Handler, die in unterschiedlichen Threads ausgeführt werden können.
- Ein anderer Ansatz bei der Verarbeitung von Zuständen. In WebGPU werden zwei Objekte vorgeschlagen - GPURenderPipeline und GPUComputePipeline, die es ermöglichen, verschiedene, vom Entwickler vordefinierte Zustände zu kombinieren, was dem Browser die Ressourcenersparnis bei zusätzlichen Arbeiten wie der Neukompilierung von Shadern ermöglicht. Zu den unterstützten Zuständen gehören: Shader, Layout der Vertex-Puffer und Attribute, Layout der angehängten Gruppen, Mischungen, Tiefe und Vorlagen, Ausgabeformate nach dem Rendering.
- Ein Bindungsmodell, das stark an die in Vulkan vorhandenen Mittel zur Gruppierung von Ressourcen erinnert. Um Ressourcen in Gruppen zusammenzufassen, stellt WebGPU das Objekt GPUBindGroup bereit, das während der Befehlsaufzeichnung mit anderen gleichartigen Objekten verbunden werden kann, um in Shaders verwendet zu werden. Die Erstellung solcher Gruppen ermöglicht es dem Treiber, die notwendigen Vorbereitungen im Voraus durchzuführen, während der Browser deutlich schneller die Ressourcenzuordnungen zwischen den Renderaufrufen ändern kann. Das Layout der Ressourcenzuordnungen kann im Voraus mit dem Objekt GPUBindGroupLayout definiert werden.
Quelle: opennet.ru
