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üntüleme biçimleri belirli kullanımlarla uyumlu olmadığından bu durum sorun yaratabilir. Bu sorunu çözmek için createView() işlevini isteğe bağlı usage üyesiyle çağırmak, kaynak dokudaki kullanım işaretlerinin seçilen görüntü biçimiyle uyumlu alt kümesini açıkça belirtmenize olanak tanır.

Bu değişiklik, önceden doğrulama yapılmasına ve görünümün nasıl kullanıldığı üzerinde daha ayrıntılı kontrol sahibi olmaya olanak tanır. Ayrıca, kullanım işaretlerinin görüntü oluşturmada ortak parametreler olduğu diğer grafik API'leriyle uyumlu olup 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ı dokuların harmanlanması

32 bit kayan noktalı dokular, HDR oluşturma işleminde çok çeşitli renk değerlerini korumak ve renk şeritleri kusurlarını önlemek için gereklidir. Örneğin, bilimsel görselleştirmede.

Yeni "float32-blendable" GPU özelliği, "r32float", "rg32float" ve "rgba32float" biçimlerine sahip GPU dokularının karıştırılmasını sağlar. Bu özellikli bir GPU cihazı istediğinizde artık float32 biçiminde herhangi bir ek ile harmanlama kullanan bir oluşturma ardışık düzeni oluşturabilirsiniz.

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 nesnelerini alan kitaplıkların fiziksel GPU hakkındaki bilgilere erişmesi önemlidir. Bunun nedeni, GPU mimarisine göre optimizasyon yapmaları veya geçici çözümler uygulamalarının gerekmesidir. Bu bilgilere GPUAdapter nesnesi aracılığıyla erişilebilir ancak yalnızca GPUDevice'ten doğrudan alınamaz. Bu, kullanıcıların GPUDevice ile birlikte ek bilgi sağlamasını gerektirebileceğinden sakıncalı olabilir.

Bu sorunu gidermek için GPUAdapterInfo artık GPUDevice adapterInfo özelliği aracılığıyla gösteriliyor. Bunlar mevcut GPUAdapter info özelliğine benzer.

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

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

Tuval bağlamını geçersiz biçimle yapılandırırken JavaScript hatası oluşuyor

Daha önce, GPU tuval bağlamının configure() yöntemiyle geçersiz bir doku biçimi kullanmak GPU doğrulama hatasına neden oluyordu. Bu, JavaScript TypeError atacak şekilde değiştirildi. Bu sayede, GPU kanvası bağlamı yanlış yapılandırılmış olmasına rağmen getCurrentTexture()'in geçerli bir GPU dokusu döndürdüğü senaryolar önlenir. Daha fazla bilgiyi 372837859 numaralı sorunda bulabilirsiniz.

Dokularda filtreleme örnekleyicisi kısıtlamaları

Daha önce, filtreleme örnekleri içeren "sint", "uint" ve "depth" biçimli dokulara izin veriliyordu. Artık filtreleme örnekleyicisi ile "sint" veya "uint" biçimli bir doku kullanılmasına doğru şekilde izin verilmiyor. Gelecekte izin verilmeyeceği için şu anda "depth" filtreleme örnekleyicisi içeren bir doku" kullanırsanız uyarı gösterildiğini unutmayın. 376497143 numaralı soruna bakın.

Bu kısıtlamalar, filtreleme yapmayan bir örnekleyiciyle derinlik dokusu kullanılması durumunda bağlama grubu düzenlerinin manuel olarak oluşturulması gerektiği anlamına gelir. Bunun nedeni, "otomatik" olarak oluşturulan bağlama grubu düzenlerinin henüz bu kombinasyonu desteklememesidir. 4952 numaralı spesifikasyon sorunu, gelecekte bu sınırlamayı gidermek için üzerinde çalışılan bir öneri içerir.

Genişletilmiş alt grup denemeleri

Başlangıçta Chrome 131'de sona ereceği planlanan alt grup denemesi, Chrome 133'e kadar uzatıldı ve 16 Nisan 2025'te sona erecek. İlk kaynak denemesi performansa odaklanırken önemli taşıma önlemleri içermiyordu. Bu önlemler eklenecek ve mevcut kodda hatalara neden olabilir.

Geliştirici deneyimini iyileştirme

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

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

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

16 bit işaretli normalleştirilmiş ve işaretsiz normalleştirilmiş doku biçimleri, standartlaştırma için tartışılmakta olsa da "chromium-experimental-snorm16-texture-formats" ve "chromium-experimental-unorm16-texture-formats" GPU özellikleriyle birlikte deneysel olarak kullanılabilir.

Bu özellikler, COPY_SRC, COPY_DST, TEXTURE_BINDING, RENDER_ATTACHMENT kullanımları, çok örnekleme ve çözümleme özellikleriyle 16 bit normalleştirilmiş doku biçimleri için destek ekler. Diğer biçimler "r16unorm", "rg16unorm", "rgba16unorm", "r16snorm", "rg16snorm" ve "rgba16snorm"'dir.

Bu deneysel özellikler standart hale gelene kadar, Chrome'da kullanılabilmesi için chrome://flags/#enable-unsafe-webgpu adresinde "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...

Şafak güncellemeleri

wgpu::Adapter ve wgpu::Device'deki EnumerateFeatures(FeatureName * features) yöntemleri kullanımdan kaldırılarak yerine GetFeatures(SupportedFeatures * features) getirilmiştir. 368672123 numaralı soruna bakın.

webgpu.h C API'sinde tüm char const *, bir görünümü UTF-8 kodlamalı bir dize olarak tanımlayan WGPUStringView yapısıyla değiştirildi. Bir uzunlukla birlikte dizenin verilerine işaretçi gibi davranır. Bu sayede, bir dizenin kopyasını oluşturmadan dizenin bölümlerini kullanabilirsiniz. 42241188 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 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