Co nowego w WebGPU (Chrome 132)

François Beaufort
François Beaufort

Data publikacji: 8 stycznia 2025 r.

Korzystanie z widoku tekstur

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 pewnymi 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 weryfikację z góry 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 o 32-bitowej precyzji zmiennoprzecinkowej 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 tekstur GPU w formatach "r32float", "rg32float" i "rgba32float". W przypadku żądania urządzenia z procesorem graficznym z tą funkcją możliwe jest teraz tworzenie potoku 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 kanwy 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 źle skonfigurowany. Więcej informacji znajdziesz w problemie 372837859.

Ograniczenia filtrowania próbkowania w przypadku tekstur

Dotychczas 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 bindowania 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

Eksperymentowanie z podgrupami, które miało się zakończyć w Chrome 131, zostało przedłużone do Chrome 133 i zakończy się 16 kwietnia 2025 r. Chociaż pierwsza próba była skoncentrowana 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.

Ulepszenia dla programistów

W Narzędziach deweloperskich wyświetla się teraz ostrzeżenie, gdy w systemie Windows używasz opcji powerPreferencerequestAdapter(). 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.

Podczas tworzenia zbyt dużego bufora GPU w komunikacie o błędzie jest teraz widoczny rozmiar bufora GPU. Zobacz problem 374167798.

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

16-bitowe skompresowane i nieskompresowane skompresowane formaty tekstur są teraz dostępne w wersji eksperymentalnej odpowiednio w funkcjach GPU "chromium-experimental-snorm16-texture-formats""chromium-experimental-unorm16-texture-formats", a ich użycie jest omawiane w kontekście ujednolicania formatów.

Te funkcje umożliwiają obsługę 16-bitowych sformatowanych tekstur z użyciem COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT, multisamplingu i funkcji 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 znaków połączony z długością. Dzięki temu możesz pracować z poszczególnymi częściami ciągu bez konieczności ich kopiowania. Zobacz problem 42241188.

Dotyczy to tylko niektórych kluczowych informacji. Zapoznaj się z pełną listą commitów.

Co nowego w WebGPU

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

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