Nowości w WebGPU (Chrome 128)

François Beaufort
François Beaufort

Eksperymentowanie z podgrupami

Funkcja podgrup umożliwia równoległość na poziomie SIMD, dzięki czemu wątki w grupie mogą się komunikować i wykonywać zbiorcze operacje matematyczne (np. obliczać sumę 16 liczb). Zapewnia to bardzo wydajną formę udostępniania danych między wątkami.

Minimalna implementacja propozycji podgrup jest dostępna do testowania lokalnego za flagą „Unsafe WebGPU Support” (Niebezpieczne wsparcie WebGPU) pod adresem chrome://flags/#enable-unsafe-webgpu.

Możesz też wypróbować podgrupy w swojej witrynie z udziałem prawdziwych użytkowników, rejestrując się w programie testów źródła. Instrukcje przygotowania witryny do korzystania z okresów próbnych znajdziesz w artykule Wprowadzenie do okresów próbnych. Wersja próbna origin będzie działać od Chrome 128 do Chrome 131 (zakończy się 19 lutego 2025 r.). Zobacz Zamiar przeprowadzenia eksperymentu.

Gdy funkcja "subgroups" będzie dostępna w GPUAdapter, poproś o GPUDevice z tą funkcją, aby uzyskać obsługę podgrup w WGSL i sprawdzić limity minSubgroupSizemaxSubgroupSize.

Musisz też wyraźnie włączyć to rozszerzenie w kodzie WGSL za pomocą enable subgroups;. Po włączeniu tej opcji uzyskasz dostęp do tych dodatków:

  • subgroup_invocation_id: wbudowana wartość indeksu wątku w podgrupie.
  • subgroup_size: wbudowana wartość dostępu do rozmiaru podgrupy.
  • subgroupBallot(value): zwraca zestaw pól bitowych, w którym bit odpowiadający argumentowi subgroup_invocation_id ma wartość 1, jeśli argument value ma wartość true w przypadku aktywnego wywołania, a w przeciwnym razie – 0.
  • subgroupBroadcast(value, id): rozsyła value z wywołania z subgroup_invocation_id pasującym do id do wszystkich wywołań w podgrupie. Uwaga: id musi być stałą czasu kompilacji.

W przyszłości dodamy więcej wbudowanych funkcji, takich jak subgroupAdd, subgroupAll, subgroupElectsubgroupShuffle. Zobacz problem 354738715.

Aby zezwolić na używanie typu f16 w operacjach na podgrupach, poproś o GPUDevice z funkcjami "subgroups", "subgroups-f16""shader-f16", a następnie włącz go w kodzie WGSL za pomocą enable f16, subgroups, subgroups_f16;.

Poniższy fragment kodu stanowi podstawę do eksperymentowania i odkrywania potencjału podgrup.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

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

Wycofanie ustawiania odchylenia głębi dla linii i punktów

Zmiana specyfikacji WebGPU powoduje, że ustawienie wartości depthBias, depthBiasSlopeScaledepthBiasClamp na wartość inną niż zero, gdy topologia potoku renderowania jest typu linia lub punkt, jest błędem weryfikacji. Aby dać deweloperom wystarczająco dużo czasu na zaktualizowanie kodu, w konsoli Narzędzi deweloperskich wyświetlane jest ostrzeżenie o nadchodzącej weryfikacji, a w tych okolicznościach wartości są wymuszane na 0. Zobacz problem 352567424.

Ukrywanie ostrzeżenia Narzędzi deweloperskich o nieprzechwyconym błędzie, jeśli użyto metody preventDefault

W konsoli Narzędzi deweloperskich nie są już wyświetlane ostrzeżenia dotyczące zdarzeń uncapturederror, jeśli zarejestrowano detektor zdarzeń dla uncapturederror, a w wywołaniu zwrotnym detektora zdarzeń wywołano metodę preventDefault() zdarzenia. Takie działanie jest zgodne z obsługą zdarzeń w JavaScript. Zapoznaj się z tym przykładem i problemem 40263619.

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL najpierw interpoluje próbkowanie, a następnie

Atrybut WGSL interpolate umożliwia zarządzanie interpolacją danych wejścia/wyjścia zdefiniowanych przez użytkownika. Nowe parametry próbkowania interpolacyjnego first (domyślny) i either zapewniają dodatkową kontrolę: first używa wartości z pierwszego wierzchołka elementu pierwotnego, a either umożliwia użycie pierwszego lub ostatniego wierzchołka. Zobacz problem 340278447.

Aktualizacje o świcie

Wdrożenie WGPUFuture w Dawn do obsługi operacji asynchronicznych zostało zakończone. Kluczowe pojęcia to wgpuInstanceProcessEvents do oportunistycznego przetwarzania zdarzeń i WGPUCallbackMode do definiowania lokalizacji wywołań zwrotnych. WGPUFuture oznacza jednorazowe zdarzenia o nieskończonym czasie trwania, a wgpuInstanceWaitAny czeka na zakończenie dowolnego przyszłego zdarzenia lub na upłynięcie limitu czasu. Zobacz problem 42240932.

Wartość CompositeAlphaMode::Auto nie jest już raportowana przez Surface::GetCapabilities(). Jest nadal ważny i odpowiada Surface::GetCapabilities().alphaMode[0]. Zobacz problem 292.

Backend OpenGL obsługuje teraz Surface z operacją blit z odwróceniem w osi Y dla każdego wywołania Present(). Zobacz problem 344814083.

Metoda Adapter::GetProperties() została wycofana i zastąpiona metodą Adapter::GetInfo().

Jaswant, zewnętrzny współtwórca, przepisał wszystkie pliki CMake, dzięki czemu łatwiej je aktualizować i umożliwiają one wstępne kompilacje. Zapoznaj się z krótkim przewodnikiem po używaniu Dawn w projektach CMake.

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