WebGPU'da Yenilikler (Chrome 132)

François Beaufort
François Beaufort

Yayınlanma tarihi: 8 Ocak 2025

Doku görünümü kullanımı

GPU doku görünümleri şu anda kaynak GPU dokusundaki tüm kullanım işaretlerini devralır. Bazı görünüm biçimleri belirli kullanımlarla uyumlu olmadığından bu durum sorunlara yol açabilir. Bu sorunu çözmek için, isteğe bağlı usage üyesiyle createView() işlevini çağırdığınızda, kaynak dokunun kullanım işaretlerinin seçilen görünüm biçimiyle uyumlu bir alt kümesini açıkça belirtebilirsiniz.

Bu değişiklik, önceden doğrulama ve görünümün nasıl kullanıldığı üzerinde daha ayrıntılı kontrol sağlar. Ayrıca, kullanım işaretlerinin görünüm oluşturmada yaygın parametreler olduğu diğer grafik API'leriyle de uyumludur ve optimizasyon fırsatları sunar.

Aşağıdaki snippet'i, chromestatus girişini ve 363903526 numaralı sorunu inceleyin.

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.
});

32 bit kayan noktalı doku karıştırma

32 bit kayan nokta dokular, geniş bir renk değeri aralığını korumak ve renk bantlama artefaktlarını önlemek için HDR oluşturmada gereklidir. Örneğin, bilimsel görselleştirmede.

Yeni "float32-blendable" GPU özelliği, "r32float", "rg32float" ve "rgba32float" biçimlerindeki GPU dokularını karıştırılabilir hale getirir. Bu özellik ile GPU cihazı istenirken artık herhangi bir float32 biçimli ekle karıştırma kullanan bir oluşturma işlem hattı oluşturulabilir.

Aşağıdaki snippet'e, chromestatus girişine ve 369649348 numaralı soruna bakın.

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...

GPUDevice adapterInfo özelliği

Kullanıcı tarafından sağlanan GPUDevice nesneleri alan kitaplıkların, fiziksel GPU ile ilgili bilgilere erişmesi önemlidir. Bu kitaplıkların, GPU mimarisine göre optimizasyon yapması veya geçici çözümler uygulaması gerekebilir. Bu bilgilere GPUAdapter nesnesi üzerinden erişmek mümkün olsa da yalnızca GPUDevice nesnesinden doğrudan almak mümkün değildir. Bu durum, kullanıcıların GPUDevice ile birlikte ek bilgiler sağlamasını gerektirebileceğinden rahatsız edici olabilir.

Bu sorunu çözmek için GPUAdapterInfo artık GPUDevice adapterInfo özelliği üzerinden kullanıma sunuluyor. Bu özellikler, mevcut GPUAdapter info özelliğine benzer.

Aşağıdaki snippet'i, chromestatus girişini ve 376600838 numaralı sorunu inceleyin.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

Geçersiz biçimdeki tuval bağlamını yapılandırma JavaScript hatası veriyor

Daha önce, GPU tuval bağlamının configure() yöntemiyle geçersiz bir doku biçimi kullanıldığında GPU doğrulama hatası oluşuyordu. Bu, JavaScript TypeError oluşturacak şekilde değiştirildi. Bu, GPU tuval bağlamı yanlış yapılandırılmış olmasına rağmen getCurrentTexture()'ın geçerli bir GPU dokusu döndürdüğü senaryoları önler. Daha fazla bilgiye 372837859 numaralı sorundan ulaşabilirsiniz.

Doku üzerindeki filtreleme örnekleyici kısıtlamaları

"sint", "uint" ve "depth" biçimindeki dokuların filtreleme örnekleriyle kullanılmasına daha önce izin veriliyordu. Artık filtreleme örnekleyiciyle "sint" veya "uint" biçiminde doku kullanılması doğru şekilde engelleniyor. Şu anda, gelecekte izin verilmeyeceği için filtreleme örnekleyici içeren bir "depth"" dokusu kullanırsanız uyarı verildiğini unutmayın. 376497143 numaralı sorunu inceleyin.

Bu kısıtlamalar, filtreleme içermeyen bir örnekleyiciyle derinlik dokusu kullanmanın bağlama grubu düzenlerinin manuel olarak oluşturulmasını gerektirdiği anlamına gelir. Bunun nedeni, "otomatik" olarak oluşturulan bağlama grubu düzenlerinin bu kombinasyonu henüz desteklememesidir. Spec issue 4952, bu sınırlamayı gelecekte gidermek için değerlendirilen bir öneri içerir.

Genişletilmiş alt grup denemesi

Başlangıçta Chrome 131'de sona ermesi planlanan alt grup denemesi, Chrome 133'e kadar uzatıldı ve 16 Nisan 2025'te sona erecek. İlk kaynak denemesi performansa odaklanmış olsa da önemli taşınabilirlik korumaları eksikti. Bu güvenlik önlemleri artık eklenecek ve mevcut kodda hatalara neden olabilecek.

Geliştirici deneyimini iyileştirme

Windows'da powerPreference seçeneği requestAdapter() ile birlikte kullanıldığında artık DevTools'ta bir uyarı gösteriliyor. Chrome, iki farklı GPU'yu nasıl kullanacağını ve sonuçları nasıl birleştireceğini öğrendiğinde bu uyarı kaldırılacak. 369219127 numaralı sorunu inceleyin.

Artık çok büyük bir GPU arabelleği oluşturulurken hata mesajında GPU arabelleğinin boyutu da gösteriliyor. 374167798 numaralı soruna bakın.

16 bit normalleştirilmiş doku biçimleri için deneysel destek

16 bit imzalı normalleştirilmiş ve imzasız normalleştirilmiş doku biçimleri, standartlaştırma için tartışılırken deneysel olarak "chromium-experimental-snorm16-texture-formats" ve "chromium-experimental-unorm16-texture-formats" GPU özelliklerinin arkasında kullanıma sunulmuştur.

Bu özellikler; COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT kullanımlarıyla 16 bit normalleştirilmiş doku biçimleri, çoklu örnekleme ve çözme özelliklerine destek ekler. Ek biçimler "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" ve "rgba16snorm"'dır.

Bu deneysel özellikler standartlaştırılana kadar Chrome'da kullanılabilmeleri için chrome://flags/#enable-unsafe-webgpu adresinde "Unsafe WebGPU Support" (Güvenli Olmayan WebGPU Desteği) işaretini etkinleştirin.

Aşağıdaki snippet'i ve 374790898 numaralı sorunu inceleyin.

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...

Dawn güncellemeleri

wgpu::Adapter ve wgpu::Device'deki EnumerateFeatures(FeatureName * features) yöntemleri, GetFeatures(SupportedFeatures * features) kullanımını desteklemek için kullanımdan kaldırıldı. 368672123 numaralı soruna bakın.

webgpu.h C API, tüm char const * öğelerini UTF-8 kodlu bir dizeye görünümü tanımlayan bir WGPUStringView yapısıyla değiştirdi. Dizenin verilerine yönelik bir işaretçi gibi davranır ve uzunlukla birlikte kullanılır. Bu sayede, bir dizeyi kopyalamanıza gerek kalmadan dizenin bölümleriyle çalışabilirsiniz. 42241188 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