มีอะไรใหม่ใน WebGPU (Chrome 124)

François Beaufort
François Beaufort

พื้นผิวพื้นที่เก็บข้อมูลแบบอ่านอย่างเดียวและอ่านอย่างเดียว

ประเภทการเชื่อมโยงพื้นผิวพื้นที่เก็บข้อมูลช่วยให้ตัวปรับเฉดสีอ่านจากพื้นผิวพื้นที่เก็บข้อมูลได้โดยไม่ต้องเพิ่มการใช้งาน TEXTURE_BINDING และอ่านและเขียนแบบผสมในบางรูปแบบ เมื่อมีส่วนขยายภาษา "readonly_and_readwrite_storage_textures" WGSL ใน navigator.gpu.wgslLanguageFeatures ตอนนี้คุณจะตั้งค่าสิทธิ์เข้าถึง GPUStorageTexture เป็น "read-write" หรือ "read-only" เมื่อสร้างเลย์เอาต์การเชื่อมโยงกลุ่มได้แล้ว ก่อนหน้านี้มีการจำกัดไว้เพียง "write-only"

จากนั้นโค้ดเฉดสี WGSL จะใช้ตัวระบุการเข้าถึง read_write และ read สำหรับพื้นผิวพื้นที่เก็บข้อมูลได้ ฟังก์ชัน textureLoad() และ textureStore() จะทํางานให้สอดคล้องกัน และมีฟังก์ชัน textureBarrier() ในตัวใหม่ซึ่งพร้อมสำหรับซิงค์ข้อมูลการเข้าถึงหน่วยความจำพื้นผิวในกลุ่มงาน

ขอแนะนำให้ใช้ requires-directive เพื่อบ่งบอกโอกาสในการถ่ายโอนไม่ได้ด้วย requires readonly_and_readwrite_storage_textures; ที่ด้านบนของโค้ด Shader ของ WGSL ดูตัวอย่างและปัญหา dawn:1972

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

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

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

const shaderModule = device.createShaderModule({ code: `
  requires readonly_and_readwrite_storage_textures;

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

การสนับสนุนของ Service Worker และผู้ปฏิบัติงานที่แชร์

WebGPU ใน Chrome ยกระดับการสนับสนุนของผู้ปฏิบัติงานบนเว็บขึ้นไปอีกขั้น โดยปัจจุบันให้การสนับสนุนแก่ทั้งโปรแกรมทำงานของบริการและผู้ปฏิบัติงานที่แชร์ คุณสามารถใช้ Service Worker เพื่อปรับปรุงงานในเบื้องหลังและความสามารถในการทำงานแบบออฟไลน์ รวมทั้งใช้ผู้ปฏิบัติงานที่แชร์เพื่อแชร์ทรัพยากรผ่านสคริปต์ต่างๆ ได้อย่างมีประสิทธิภาพ ดูปัญหา chromium:41494731

ดูตัวอย่างส่วนขยาย Chrome และส่วนขยาย Chrome WebLLM เพื่อดูวิธีใช้ WebGPU ในโปรแกรมทำงานของบริการส่วนขยาย

วันที่ ภาพหน้าจอของส่วนขยาย Chrome WebLLM
ส่วนขยาย Chrome ของ WebLLM

แอตทริบิวต์ข้อมูลอะแดปเตอร์ใหม่

แอตทริบิวต์ข้อมูลอะแดปเตอร์ d3dShaderModel และ vkDriverVersion ที่ไม่ใช่แบบมาตรฐานพร้อมให้บริการเมื่อเรียกใช้ requestAdapterInfo() หากผู้ใช้เปิดใช้ "ฟีเจอร์สำหรับนักพัฒนาแอป WebGPU" แจ้งที่ chrome://flags/#enable-webgpu-developer-features ในกรณีที่รองรับ

ภาพหน้าจอของ https://webgpureport.org ซึ่งแสดง vkDriverVersion ในข้อมูลอะแดปเตอร์
ข้อมูลอะแดปเตอร์vkDriverVersionแสดงใน https://webgpureport.org

การแก้ไขข้อบกพร่อง

การสร้างไปป์ไลน์ 2 รายการที่มี Bindgroups ที่ตรงกันโดยใช้ layout: "auto" จากนั้นการสร้าง Bindgroup ที่มีไปป์ไลน์แรก และตอนนี้การใช้ในไปป์ไลน์ที่ 2 จะเป็นการเพิ่ม GPUValidationError การอนุญาตนี้คือข้อบกพร่องในการใช้งาน ซึ่งตอนนี้ได้รับการแก้ไขแล้วด้วยการทดสอบที่เหมาะสม ดูปัญหา dawn:2402

ข้อมูลอัปเดตรุ่งเช้า

ใน Dawn API จะไม่มีการเรียก Callback สำหรับข้อผิดพลาดที่ไม่ได้บันทึกด้วย wgpuDeviceSetUncapturedErrorCallback หลังจากที่อุปกรณ์ GPU สูญหาย การแก้ไขนี้ทำให้ Dawn มีความสอดคล้องตามข้อกำหนดของ JavaScript API และการใช้งานของ Blink ดูปัญหา dawn:2459

ซึ่งกล่าวถึงไฮไลต์สำคัญเพียงบางส่วนเท่านั้น ดูรายการคอมมิตทั้งหมด

มีอะไรใหม่ใน WebGPU

รายการทั้งหมดที่กล่าวถึงในซีรีส์ What's New in WebGPU

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