Funkcje WebGPU dla programistów

François Beaufort
François Beaufort

Data publikacji: 3 czerwca 2025 r.

Implementacja interfejsu WebGPU API w Chrome obejmuje funkcje przeznaczone wyłącznie do celów programistycznych i testowania. Te funkcje wykraczają poza standardową specyfikację WebGPU i nie można ich używać w wersji produkcyjnej.

Ten dokument zawiera szczegółowe informacje o włączaniu funkcji dla deweloperów WebGPU oraz ich obszerną listę.

Warunek wstępny

Aby włączyć funkcje dla deweloperów WebGPU w Chrome, wykonaj te czynności:

  1. Włącz flagę „WebGPU Developer Features” (Funkcje dla programistów WebGPU) na stronie chrome://flags/#enable-webgpu-developer-features.
  2. Ponownie uruchom przeglądarkę Chrome.

Wyłączanie kwantyzacji zapytań dotyczących sygnatury czasowej

Zapytania o sygnaturę czasową umożliwiają aplikacjom WebGPU dokładne pomiary (z dokładnością do nanosekundy) czasu wykonywania poleceń GPU podczas przejść obliczeniowych i renderowania. Te zapytania są niezbędne do analizowania wydajności i zachowania obciążenia GPU. Więcej informacji znajdziesz w artykule Zapytania o stemplę czasu w przetwarzaniu i renderowaniu.

Ze względu na ataki oparte na pomiarze czasu zapytania dotyczące sygnatury czasowej są kwantowane z rozdzielczością 100 mikrosekund, co zapewnia dobry kompromis między dokładnością a bezpieczeństwem. Ta kwantyzacja jest automatycznie wyłączana, gdy włączona jest flaga „Funkcje dla programistów WebGPU”.

Rozszerzone informacje o adapterze

Aby uzyskać więcej informacji o używanym adapterze, użyj atrybutu GPUAdapterInfo, który zawiera te atrybuty:

  • Atrybut device (standardowy) to identyfikator karty specyficzny dla danego dostawcy.
  • Atrybut description (standardowy) to zrozumiały dla człowieka ciąg tekstowy zawierający szczegóły adaptera.
  • Atrybut driver (niestandardowy) to zrozumiały dla człowieka ciąg tekstowy opisujący sterownik.
  • Atrybut backend (niestandardowy) wskazuje backend graficzny, np. "WebGPU", "D3D11", "D3D12", "metal", "vulkan", "openGL", "openGLES" lub "null".
  • Atrybut type (niestandardowy) identyfikuje typ GPU: "discrete GPU", "integrated GPU", "CPU" lub "unknown".
  • Atrybut d3dShaderModel (niestandardowy) określa maksymalny obsługiwany numer modelu shadera D3D. Na przykład 62 wskazuje obsługę HLSL SM 6.2.
  • Atrybut vkDriverVersion (niestandardowy) to wersja sterownika Vulkana określona przez dostawcę.
  • Atrybut powerPreference (niestandardowy) ma wartość "low-power" lub "high-performance", zależnie od wartości atrybutu GPUPowerPreference w GPURequestAdapterOptions.

Aby przewidzieć ograniczenia pamięci podczas przydzielania dużych ilości podczas tworzenia aplikacji, GPUAdapterInfo udostępnia memoryHeaps niestandardowe informacje, takie jak rozmiar i typ stosów pamięci dostępnych na adapterze.

const adapter = await navigator.gpu.requestAdapter();

for (const { size, properties } of adapter.info.memoryHeaps) {
  console.log(size); // memory heap size in bytes
  if (properties & GPUHeapProperty.DEVICE_LOCAL)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_VISIBLE)  { /* ... */ }
  if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
  if (properties & GPUHeapProperty.HOST_CACHED)   { /* ... */ }
}

Opcja kompilacji modułu shadera ścisła matematyka

Struktura GPUShaderModuleDescriptor zawiera opcję logiczną strictMath, która włącza lub wyłącza ścisłą matematyczną precyzję podczas kompilacji modułu shadera. Ta opcja jest obsługiwana w Metal i Direct3D. Gdy opcja strictMath jest włączona, kompilator przestrzega ścisłych reguł matematycznych. Wyłączenie tej opcji pozwala kompilatorowi zoptymalizować shadery, wykonując te czynności:

  • Ignorowanie możliwości wystąpienia wartości NaN i Infinity.
  • Uważanie -0 za +0.
  • Zastąpienie dzielenia szybszym mnożeniem przez odwrotną wartość.
  • przestawianie operacji na podstawie właściwości asocjacyjnych i rozpościelnych;
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const code = `
  // Examines the bit pattern of the floating-point number to
  // determine if it represents a NaN according to the IEEE 754 standard.
  fn isNan(x : f32) -> bool {
    bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
    bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
    return ones_exp && non_zero_sig;
  }
  // ...
`;

// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });

Importowanie filmu z wykorzystaniem funkcji zero-copy

Atrybut boolean GPUExternalTexture isZeroCopy (niestandardowy) informuje, czy GPU uzyskało dostęp do filmu zaimportowanego za pomocą funkcji importExternalTexture() bezpośrednio, bez tworzenia kopii pośredniej.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });

if (externalTexture.isZeroCopy) {
  console.log('Video frame was accessed directly by the GPU');
}