WebGPU'da Yenilikler (Chrome 133)

François Beaufort
François Beaufort

Yayınlanma tarihi: 29 Ocak 2025

Ek unorm8x4-bgra ve 1 bileşenli köşe noktası biçimleri

"unorm8x4-bgra" köşe noktası biçimi ve aşağıdaki 1 bileşenli köşe noktası biçimleri eklendi: "uint8", "sint8", "unorm8", "snorm8", "uint16", "sint16", "unorm16", "snorm16" ve "float16". "unorm8x4-bgra" köşe noktası biçimi, aynı gölgelendiriciyi korurken BGRA kodlu köşe noktası renklerini yüklemeyi biraz daha kolaylaştırır. Ayrıca, 1 bileşenli köşe noktası biçimi, daha önce 8 ve 16 bit veri türleri için en az iki kat daha fazla veri gerektiğinde yalnızca gerekli verileri istemenize olanak tanır. chromestatus girişine ve 376924407 numaralı soruna bakın.

Bilinmeyen sınırların, tanımlanmamış değerle istenmesine izin verme

WebGPU API'nin geliştikçe daha az kırılgan olmasını sağlamak için artık GPU cihazı isteğinde bulunurken undefined değeriyle bilinmeyen sınırlar isteyebilirsiniz. Bu, aşağıdaki uygulama kodunda yararlıdır. Örneğin, someLimit artık mevcut değilse adapter.limits.someLimit, undefined olabilir. spec PR 4781'e bakın.

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

WGSL hizalama kurallarında yapılan değişiklikler

Artık tüm yapıların @align(n) değerinin RequiredAlignOf değerini bölmesi gerektiğinden, yapı üyeleri için çok küçük bir hizalama değeri sağlamak mümkün değildir. Bu önemli değişiklik, WGSL dilinin kullanımını basitleştirir ve Firefox ile Safari ile daha uyumlu hale getirir. Tint, Naga ve WebKit derleyicileri arasındaki farkları gösteren örnek kodu özellik PR'sinde bulabilirsiniz.

Atma ile WGSL performans kazançları

Karmaşık bir ekran alanı yansıması (SSR) efekti oluşturulurken önemli bir performans düşüşü gözlemlendiğinden, discard ifadesi uygulaması, varsa yardımcı çağrıya indirgeme için platform tarafından sağlanan semantiği kullanır. Bu, discard kullanan gölgelendiricilerin performansını iyileştirir. 372714384 numaralı soruna bakın.

Harici dokular için VideoFrame displaySize özelliğini kullanın

WebGPU spesifikasyonuna göre bir VideoFrame içe aktarılırken GPUExternalTexture'ın görünen boyutu olarak displayWidth ve displayHeight boyutları kullanılmalıdır. Ancak görünür boyut yanlış kullanıldığı için GPUExternalTexture üzerinde textureLoad() kullanılırken sorunlar yaşanıyordu. Bu sorun artık düzeltildi. 377574981 numaralı soruna bakın.

copyExternalImageToTexture işlevini kullanarak varsayılan olmayan yönlere sahip resimleri işleme

copyExternalImageToTexture() GPUQueue yöntemi, bir resmin veya kanvasın içeriğini bir dokuya kopyalamak için kullanılır. Artık varsayılan olmayan yönlere sahip resimleri düzgün şekilde işlemektedir. Kaynak imageOrientation "from-image" içeren bir ImageBitmap veya varsayılan olmayan bir yönü olan bir resim olduğunda daha önce bu durum geçerli değildi. 384858956 numaralı soruna bakın.

Geliştirici deneyimini iyileştirme

adapter.limits yüksek değerler gösterdiğinde ancak GPU cihaz isteğinde bulunurken açıkça daha yüksek bir sınır istemeniz gerektiğini fark etmediğinizde şaşırabilirsiniz. Aksi takdirde, daha sonra sınırlara beklenmedik şekilde ulaşabilirsiniz.

Size yardımcı olmak için hata mesajları, requestDevice() çağrısı yapılırken requiredLimits içinde sınır belirtilmediğinde daha yüksek bir sınırı açıkça istemenizi söyleyen ipuçlarıyla genişletildi. 42240683 numaralı soruna bakın.

Aşağıdaki örnekte, varsayılan maksimum arabellek boyutu cihaz sınırını aşan bir GPU arabelleği oluştururken DevTools konsoluna kaydedilen gelişmiş bir hata mesajı gösterilmektedir.

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

featureLevel ile uyumluluk modunu etkinleştirme

Standartlaştırılmış featureLevel seçeneğini "compatibility" olarak ayarlayarak artık deneysel uyumluluk modunda GPU adaptörü isteğinde bulunabilirsiniz. Yalnızca "core" (varsayılan) ve "compatibility" dizelerine izin verilir. Aşağıdaki örneğe ve spec PR 4897'ye bakın.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

featureLevel seçeneği, standart olmayan compatibilityMode seçeneğinin yerini alırken standart olmayan featureLevel özelliği, isCompatibilityMode özelliğinin yerini alır.

Hâlâ deneysel olduğu için Chrome'u şu anda chrome://flags/#enable-unsafe-webgpu değerinde "Güvenli Olmayan WebGPU Desteği" işaretiyle çalıştırmanız gerekir. Bu özelliği kullanmak için webgpureport.org adresine göz atın.

Deneysel alt grup özelliklerini temizleme

Desteği sonlandırılan "chromium-experimental-subgroups" ve "chromium-experimental-subgroup-uniform-control-flow" deneysel alt grup özellikleri kaldırıldı. 377868468 numaralı sorun için buraya bakın.

Alt gruplarla deneme yaparken artık tek ihtiyacınız olan "subgroups" deneysel özelliğidir. "subgroups-f16" deneysel özelliğinin desteği sonlandırıldı ve yakında kaldırılacak. Uygulamanız hem "shader-f16" hem de "subgroups" özelliklerini istediğinde alt gruplarla f16 değerlerini kullanabilirsiniz. 380244620 numaralı soruna bakın.

maxInterStageShaderComponents sınırının desteği sonlandırıldı

maxInterStageShaderComponents sınırı, aşağıdaki faktörlerin bir araya gelmesi nedeniyle kullanımdan kaldırılıyor:

  • maxInterStageShaderVariables ile yedekleme: Bu sınır, gölgelendirici aşamaları arasında aktarılan veri miktarını kontrol ederek zaten benzer bir amaca hizmet etmektedir.
  • Küçük tutarsızlıklar: İki sınırın hesaplanmasında küçük farklılıklar olsa da bu farklılıklar küçüktür ve maxInterStageShaderVariables sınırı dahilinde etkili bir şekilde yönetilebilir.
  • Basitleştirme: maxInterStageShaderComponents kaldırılarak gölgelendirici arayüzü basitleştirilir ve geliştiriciler için karmaşıklık azaltılır. Küçük farklılıkları olan iki ayrı sınırı yönetmek yerine, daha uygun şekilde adlandırılmış ve kapsamlı maxInterStageShaderVariables'ye odaklanabilirler.

Hedef, bu özelliği Chrome 135'te tamamen kaldırmaktır. Desteği sonlandırma amacı ve 364338810 numaralı sorun için bakın.

Şafak güncellemeleri

wgpu::Device::GetAdapterInfo(adapterInfo), doğrudan wgpu::Device'ten adaptör bilgilerini almanıza olanak tanır. 376600838 numaralı soruna bakın.

Hesaplama durumunu köşe ve parça durumlarıyla tutarlı hale getirmek için WGPUProgrammableStageDescriptor yapı, WGPUComputeState olarak yeniden adlandırıldı. 379059434 numaralı soruna bakın.

wgpu::VertexStepMode::VertexBufferNotUsed enum değeri kaldırıldı. Kullanılmayan bir köşe ucu arabelleği düzeni artık {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} ile ifade edilebilir. 383147017 numaralı soruna bakın.

Bu, önemli noktalardan yalnızca bazılarını kapsar. Kapsamlı commit listesine göz atın.

WebGPU'daki Yenilikler

WebGPU'daki Yenilikler serisinde ele alınan tüm konuların listesi.

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