Funkcje WebGPU dla programistów

François Beaufort
François Beaufort

Opublikowano: 3 czerwca 2025 r.

Implementacja interfejsu WebGPU API w Chrome zawiera funkcje przeznaczone wyłącznie do programowania i testowania. Te funkcje wykraczają poza standardową specyfikację WebGPU. Nie używaj tych funkcji w środowisku produkcyjnym.

W tym dokumencie znajdziesz szczegółowe informacje o włączaniu funkcji deweloperskich WebGPU oraz ich pełną listę.

Warunek wstępny

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

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

Wyłącz kwantyzację zapytań dotyczących sygnatur czasowych

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

Ze względu na obawy związane z atakami czasowymi zapytania o sygnatury czasowe są kwantyzowane z rozdzielczością 100 mikrosekund, co stanowi dobry kompromis między precyzją a bezpieczeństwem. Kwantyzacja jest automatycznie wyłączana, gdy włączona jest flaga „Funkcje deweloperskie WebGPU”.

Rozszerzone informacje o adapterze

Aby lepiej poznać używany adapter, interfejs GPUAdapterInfo udostępnia te atrybuty:

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

Aby przewidzieć ograniczenia pamięci podczas przydzielania dużych ilości pamięci w trakcie tworzenia aplikacji, interfejs GPUAdapterInfo udostępnia memoryHeaps niestandardowe informacje, takie jak rozmiar i rodzaj stert pamięci dostępnych na karcie.

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 strict math

GPUShaderModuleDescriptor zawiera strictMath niestandardową opcję logiczną, która włącza lub wyłącza ścisłą precyzję matematyczną podczas kompilacji modułu cieniowania. Ta opcja jest obsługiwana w przypadku interfejsów Metal i Direct3D. Gdy funkcja strictMath jest włączona, kompilator przestrzega ścisłych reguł matematycznych. Z kolei wyłączenie tej opcji umożliwia kompilatorowi optymalizację shaderów przez:

  • Ignorowanie możliwości wystąpienia wartości NaN i Infinity.
  • Traktowanie –0 jako +0.
  • Zastąpienie dzielenia szybszym mnożeniem przez odwrotność.
  • Zmiana kolejności działań na podstawie własności łączności i rozdzielności.
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 bez kopiowania

Niestandardowy atrybut logiczny GPUExternalTexture isZeroCopy informuje, czy film zaimportowany za pomocą funkcji importExternalTexture() był bezpośrednio dostępny dla procesora graficznego bez konieczności 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');
}