Co nowego w WebGPU (Chrome 132)

François Beaufort
François Beaufort

Data publikacji: 8 stycznia 2025 r.

Użycie widoku tekstury

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

Ta zmiana umożliwia wcześniejszą weryfikację i bardziej szczegółową kontrolę nad sposobem używania widoku. Jest on również zgodny z innymi interfejsami API grafiki, w których flagi użycia są zwykłymi parametrami podczas tworzenia widoku, co daje możliwości optymalizacji.

Zobacz poniższy fragment kodu, entry w chromestatusproblem 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 o typie 32-bitowe liczby zmiennoprzecinkowe;

Tekstury 32-bitowe z liczbami zmiennoprzecinkowymi są niezbędne do renderowania HDR, ponieważ umożliwiają zachowanie szerokiego zakresu wartości kolorów i zapobiegają artefaktom w postaci pasów kolorów. Na przykład w wizualizacji naukowej.

Nowa funkcja GPU "float32-blendable" umożliwia stosowanie cieniowania dla tekstur GPU w formatach "r32float", "rg32float""rgba32float". Podczas żądania urządzenia z procesorem graficznym z tą funkcją można teraz tworzyć potok renderowania, który używa mieszania z dowolnym załącznikiem w formacie float32.

Zapoznaj się z tym fragmentem kodu, informacją w chromestatusproblemem 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 GPUDevice adapterInfo

Jest to ważne w przypadku bibliotek, które korzystają z obiektów GPUDevice przekazywanych przez użytkownika, ponieważ mogą wymagać optymalizacji lub wdrożenia obejścia na podstawie architektury GPU. Chociaż można uzyskać dostęp do tych informacji za pomocą obiektu GPUAdapter, nie ma bezpośredniego sposobu na uzyskanie ich z samego obiektu GPUDevice. Może to być niewygodne, ponieważ może wymagać od użytkowników podania dodatkowych informacji oprócz GPUDevice.

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

Zapoznaj się z podanym niżej fragmentem kodu, informacją na stronie chromestatus oraz problemem 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 kanwy z nieprawidłowym formatem powoduje błąd JavaScriptu

Wcześniej używanie nieprawidłowego formatu tekstury w ramach metody configure() w kontekście płótna GPU powodowało błąd weryfikacji GPU. Zmieniono to, aby wywołać kod JavaScript TypeError. Zapobiega to sytuacjom, w których funkcja getCurrentTexture() zwraca prawidłową teksturę GPU, mimo że kontekst kanwy GPU jest nieprawidłowo skonfigurowany. Więcej informacji znajdziesz w problemie 372837859.

Filtrowanie ograniczeń próbkowania w przypadku tekstur

Wcześniej dozwolone było używanie tekstur w formacie "sint", "uint" i „depth"” z próbkami filtrowania. Teraz poprawnie zabrania używania tekstury w formacie "sint" lub "uint" z próbnikiem filtrowania. Pamiętaj, że obecnie wyświetla ono ostrzeżenie, jeśli używasz tekstury „depth"” z próbnikiem filtrowania, ponieważ w przyszłości nie będzie można tego robić. Zobacz problem 376497143.

Oznacza to, że użycie tekstury głębi z próbnikiem bez filtrowania wymaga ręcznego utworzenia układów grup wiązania. Dzieje się tak, ponieważ generowane automatycznie układy grup wiązania nie obsługują jeszcze tej kombinacji. Problem specyfikacji 4952 zawiera propozycję, która jest obecnie rozpatrywana w celu rozwiązania tego ograniczenia w przyszłości.

Eksperymentowanie z podgrupami

Eksperyment dotyczący podgrup, który miał się zakończyć w Chrome 131, został przedłużony do Chrome 133 i zakończy się 16 kwietnia 2025 r. Chociaż pierwsza wersja próbna koncentrowała się na wydajności, brakowało w niej kluczowych zabezpieczeń dotyczących przenoszenia. Te zabezpieczenia zostaną teraz dodane, co może spowodować błędy w dotychczasowym kodzie.

Ulepszenie środowiska programisty

W przypadku używania opcji powerPreference w systemie Windows requestAdapter() w narzędziu DevTools wyświetla się teraz ostrzeżenie. To ostrzeżenie zostanie usunięte, gdy Chrome będzie wiedzieć, jak używać 2 różnych procesorów graficznych i jak łączyć ich wyniki. Zobacz problem 369219127.

Rozmiar bufora GPU jest teraz widoczny w komuniku o błędzie, który pojawia się podczas tworzenia zbyt dużego bufora GPU. Zobacz problem 374167798.

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

16-bitowe skompresowane i nieskompresowane tekstury są teraz dostępne w wersji eksperymentalnej odpowiednio w funkcjach "chromium-experimental-snorm16-texture-formats""chromium-experimental-unorm16-texture-formats" procesora graficznego, a ich standaryzacja jest omawiana.

Te funkcje umożliwiają obsługę 16-bitowych sformatowanych tekstur z użyciem COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT, multisamplingu i możliwości rozwiązywania. Dodatkowe formaty to "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm""rgba16snorm".

Dopóki te funkcje eksperymentalne nie zostaną ujednolicone, włącz flagę „Niebezpieczne wsparcie WebGPU” na stronie chrome://flags/#enable-unsafe-webgpu, aby udostępnić je w Chrome.

Zapoznaj się z podanym niżej 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 świtu

Metody EnumerateFeatures(FeatureName * features) z poziomów wgpu::Adapterwgpu::Device są wycofane na rzecz GetFeatures(SupportedFeatures * features). Zobacz problem 368672123.

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

Obejmuje to tylko niektóre najważniejsze informacje. Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

Lista wszystkich tematów omawianych w cyklu Co nowego w WebGPU.

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