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 biçimleri

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

Tanımlanmamış değerle bilinmeyen sınırların istenmesine izin ver

WebGPU API'nin gelişirken daha az kırılgan olması için artık bir GPU cihazı isterken undefined değeriyle bilinmeyen sınırları isteyebilirsiniz. Bu, örneğin aşağıdaki uygulama kodunda yararlıdır. Burada adapter.limits.someLimit, someLimit artık mevcut değilse 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 için @align(n) değerinin RequiredAlignOf değerini bölmesi gerektiğinden yapı üyesi 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'yle daha uyumlu hale getirir. Tint, Naga ve WebKit derleyicileri arasındaki farkları gösteren örnek kodu spec PR'de bulabilirsiniz.

discard ile WGSL performans kazançları

Karmaşık bir ekran alanı yansımaları (SSR) efekti oluşturulurken gözlemlenen önemli performans düşüşü nedeniyle, discard ifadesinin uygulanmasında, mevcut olduğunda yardımcı çağırmaya düşürmek için platform tarafından sağlanan semantik kullanılır. Bu, discard kullanan gölgelendiricilerin performansını artırır. 372714384 numaralı sorunu inceleyin.

Harici dokular için VideoFrame displaySize'ı kullanın

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

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

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

Geliştirici deneyimini iyileştirme

adapter.limits yüksek değerler gösterdiğinde şaşırabilirsiniz ancak GPU cihazı isterken daha yüksek bir sınır için açıkça istekte bulunmanız gerektiğini fark etmeyebilirsiniz. Aksi takdirde, daha sonra beklenmedik bir şekilde sınırlara ulaşabilirsiniz.

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

Aşağıdaki örnekte, varsayılan maksimum arabellek boyutu cihaz sınırını aşan bir boyutta GPU arabelleği oluşturulurken DevTools konsoluna kaydedilen geliştirilmiş 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

Deneysel uyumluluk modunda GPU bağdaştırıcısı istemek artık standartlaştırılmış featureLevel seçeneğini "compatibility" olarak ayarlayarak mümkün. 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.

Bu özellik hâlâ deneysel aşamada olduğundan şimdilik Chrome'u chrome://flags/#enable-unsafe-webgpu adresindeki "Unsafe WebGPU Support" (Güvenli Olmayan WebGPU Desteği) işaretiyle çalıştırmanız gerekir. webgpureport.org adresine giderek bu özelliği deneyebilirsiniz.

Deneysel alt grup özelliklerinde temizleme

Desteği sonlandırılan "chromium-experimental-subgroups" ve "chromium-experimental-subgroup-uniform-control-flow" deneysel alt grup özellikleri kaldırılır. 377868468 numaralı sorunu inceleyin.

Alt gruplarla deneme yaparken artık yalnızca "subgroups" deneysel özelliğini kullanmanız yeterlidir. "subgroups-f16" deneysel özelliği kullanımdan kaldırıldı ve yakında tamamen kaldırılacak. Uygulamanız hem "shader-f16" hem de "subgroups" özelliklerini istediğinde alt gruplarla birlikte f16 değerlerini kullanabilirsiniz. 380244620 numaralı soruna bakın.

maxInterStageShaderComponents sınırının desteğini sonlandırma

maxInterStageShaderComponents sınırı, çeşitli faktörlerin bir araya gelmesi nedeniyle kullanımdan kaldırıldı:

  • maxInterStageShaderVariables ile yedeklilik: Bu sınır, gölgelendirici aşamaları arasında aktarılan veri miktarını kontrol ederek benzer bir amaca hizmet eder.
  • Küçük tutarsızlıklar: İki sınırın hesaplanma şekli arasında küçük farklılıklar olsa da bu farklılıklar önemsizdir ve maxInterStageShaderVariables sınırı içinde etkili bir şekilde yönetilebilir.
  • Basitleştirme: maxInterStageShaderComponents simgesinin kaldırılması, gölgelendirici arayüzünü basitleştirir ve geliştiriciler için karmaşıklığı azaltır. Küçük farklılıklar içeren iki ayrı sınırı yönetmek yerine, daha uygun bir şekilde adlandırılmış ve kapsamlı olan maxInterStageShaderVariables odaklanabilirler.

Bu özelliğin Chrome 135'te tamamen kaldırılması hedeflenmektedir. Desteği sonlandırma amacı ve 364338810 numaralı soruna bakın.

Dawn güncellemeleri

wgpu::Device::GetAdapterInfo(adapterInfo), adaptör bilgilerini doğrudan wgpu::Device cihazından almanıza olanak tanır. 376600838 numaralı sorunu inceleyin.

Hesaplama durumunu köşe ve parça durumlarıyla tutarlı hale getirmek için WGPUProgrammableStageDescriptor yapısı 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 arabelleği düzeni artık {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} ile ifade edilebilir. 383147017 numaralı soruna bakın.

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

WebGPU'daki yenilikler

WebGPU'daki Yenilikler serisinde ele alınan her şeyin listesi.

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