Co nowego w WebGPU (Chrome 132)

François Beaufort
François Beaufort

Data publikacji: 8 stycznia 2025 r.

Wykorzystanie widoku tekstury

Widoki tekstur GPU dziedziczą obecnie wszystkie flagi użycia z tekstury GPU źródła. Może to być problematyczne, ponieważ niektóre formaty widoku są niezgodne z określonymi zastosowaniami. Aby rozwiązać ten problem, wywołaj funkcję createView() z opcjonalnym elementem usage, aby jawnie określić podzbiór flag użycia tekstury źródłowej, które są zgodne z wybranym formatem widoku.

Ta zmiana umożliwia wstępną weryfikację i bardziej szczegółową kontrolę nad sposobem wykorzystania widoku. Jest on też zgodny z innymi interfejsami API grafiki, w których flagi użycia są typowymi parametrami podczas tworzenia widoku, co daje możliwości optymalizacji.

Zobacz ten fragment kodu, wpis w chromestatuszgłoszenie 363903526.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

Mieszanie tekstur zmiennoprzecinkowych 32-bitowych

Tekstury 32-bitowe zmiennoprzecinkowe są niezbędne do renderowania HDR, aby zachować szeroki zakres wartości kolorów i zapobiec powstawaniu artefaktów w postaci pasów kolorów. Na przykład w wizualizacji danych naukowych.

Nowa funkcja "float32-blendable" GPU umożliwia mieszanie tekstur GPU w formatach "r32float", "rg32float""rgba32float". Tworzenie potoku renderowania, który używa mieszania z dowolnym załącznikiem w formacie float32, jest teraz możliwe podczas wysyłania żądania urządzenia GPU z tą funkcją.

Zobacz ten fragment kodu, wpis w Chrome Statuszgłoszenie 369649348.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

Atrybut GPUDeviceadapterInfo

W przypadku bibliotek, które przyjmują obiekty GPUDevice dostarczane przez użytkowników, ważne jest, aby miały dostęp do informacji o fizycznym procesorze graficznym, ponieważ mogą one wymagać optymalizacji lub implementacji obejść w zależności od architektury procesora graficznego. Dostęp do tych informacji jest możliwy za pomocą obiektu GPUAdapter, ale nie można ich uzyskać bezpośrednio z samego obiektu GPUDevice. Może to być niewygodne, ponieważ może wymagać od użytkowników podania dodatkowych informacji wraz z GPUDevice.

Aby rozwiązać ten problem, GPUAdapterInfo jest teraz udostępniany za pomocą atrybutu GPUDevice adapterInfo. Są one podobne do istniejącego atrybutu GPUAdapter info.

Zapoznaj się z tym fragmentem kodu, wpisem w chromestatusproblemem 376600838.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

Konfigurowanie kontekstu elementu canvas w nieprawidłowym formacie powoduje błąd JavaScript

Wcześniej użycie nieprawidłowego formatu tekstury w metodzie configure() kontekstu płótna GPU powodowało błąd weryfikacji GPU. Zmieniliśmy to tak, aby zgłaszać błąd JavaScriptu TypeError. Zapobiega to sytuacjom, w których interfejs getCurrentTexture() zwraca prawidłową teksturę procesora graficznego, mimo że kontekst obszaru rysowania procesora graficznego jest nieprawidłowo skonfigurowany. Więcej informacji znajdziesz w zgłoszeniu 372837859.

Ograniczenia dotyczące próbkowania filtrowania w przypadku tekstur

Wcześniej można było używać tekstur w formatach "sint", "uint" i „depth" z próbkami filtrowania. Teraz prawidłowo blokuje używanie tekstury w formacie "sint" lub "uint" z próbkownikiem filtrowania. Obecnie wyświetla ostrzeżenie, jeśli używasz „depth" tekstury z próbkującym filtrowaniem, ponieważ w przyszłości będzie to niedozwolone. Zobacz problem 376497143.

Oznacza to, że używanie tekstury głębi z samplerem bez filtrowania wymaga ręcznego tworzenia układów grup wiązań. Dzieje się tak, ponieważ automatycznie generowane układy grup wiązań nie obsługują jeszcze tej kombinacji. Specyfikacja problemu 4952 zawiera propozycję, która jest rozpatrywana w celu rozwiązania tego ograniczenia w przyszłości.

Eksperymentowanie z rozszerzonymi podgrupami

Eksperymentowanie z podgrupami, które początkowo miało zakończyć się w Chrome 131, zostało przedłużone do Chrome 133 i zakończy się 16 kwietnia 2025 r. Pierwszy okres próbny skupiał się na wydajności, ale brakowało w nim kluczowych zabezpieczeń przenośności. Te zabezpieczenia zostaną teraz dodane, co może spowodować błędy w istniejącym kodzie.

Ulepszanie środowiska programistycznego

W narzędziach deweloperskich jest teraz widoczne ostrzeżenie, gdy opcja powerPreference jest używana z requestAdapter() w systemie Windows. Ten komunikat ostrzegawczy zostanie usunięty, gdy Chrome będzie wiedzieć, jak używać 2 różnych procesorów graficznych i łączyć wyniki. Zobacz problem 369219127.

Rozmiar bufora GPU jest teraz podawany w komunikacie o błędzie podczas tworzenia zbyt dużego bufora GPU. Zobacz problem 374167798.

Eksperymentalna obsługa 16-bitowych znormalizowanych formatów tekstur

Eksperymentalnie udostępniliśmy 16-bitowe formaty tekstur ze znakiem i bez znaku, które są odpowiednio powiązane z funkcjami GPU "chromium-experimental-snorm16-texture-formats" i "chromium-experimental-unorm16-texture-formats", a jednocześnie dyskutowane pod kątem standaryzacji.

Te funkcje dodają obsługę 16-bitowych znormalizowanych formatów tekstur z użyciem COPY_SRC, COPY_DST, TEXTURE_BINDINGRENDER_ATTACHMENT, a także możliwości multisamplingu i rozwiązywania. Dodatkowe formaty to "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" i "rgba16snorm".

Zanim te eksperymentalne funkcje zostaną ustandaryzowane, włącz flagę „Unsafe WebGPU Support” (Niebezpieczna obsługa WebGPU) na stronie chrome://flags/#enable-unsafe-webgpu, aby udostępnić je w Chrome.

Zapoznaj się z tym fragmentem kodu i problemem 374790898.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

Aktualizacje o świcie

Metody EnumerateFeatures(FeatureName * features)wgpu::Adapterwgpu::Device zostały wycofane na rzecz GetFeatures(SupportedFeatures * features). Zobacz problem 368672123.

W interfejsie API C webgpu.h wszystkie typy char const * zostały zmienione na strukturę WGPUStringView, która definiuje widok ciągu znaków zakodowanego w UTF-8. Działa jak wskaźnik danych ciągu znaków w połączeniu z długością. Dzięki temu możesz pracować z fragmentami ciągu znaków bez konieczności kopiowania go. Zobacz problem 42241188.

Obejmuje to tylko niektóre z najważniejszych informacji. Zapoznaj się z pełną listą zatwierdzeń.

Nowości w WebGPU

Lista wszystkich tematów omówionych w serii Co nowego w WebGPU.

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

Chrome 132

Chrome 131

Chrome 130

Chrome 129

Chrome 128

Chrome 127

Chrome 126

Chrome 125

Chrome 124

Chrome 123

Chrome 122

Chrome 121

Chrome 120

Chrome 119

Chrome 118

Chrome 117

Chrome 116

Chrome 115

Chrome 114

Chrome 113