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:
- Włącz flagę „WebGPU Developer Features” (Funkcje deweloperskie WebGPU) na stronie
chrome://flags/#enable-webgpu-developer-features. - 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');
}