มีอะไรใหม่ใน 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"

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

เราขอแนะนำให้ใช้คําสั่ง requires เพื่อบ่งบอกถึงโอกาสที่โค้ดจะไม่สามารถพอร์ตได้โดยใช้ requires readonly_and_readwrite_storage_textures; ที่ด้านบนของโค้ด Shader WGSL ดูตัวอย่างต่อไปนี้และ issue 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 เพื่อปรับปรุงงานเบื้องหลังและความสามารถแบบออฟไลน์ รวมถึงใช้ Shared Worker เพื่อแชร์ทรัพยากรอย่างมีประสิทธิภาพระหว่างสคริปต์ต่างๆ ดูปัญหา chromium:41494731

ดูตัวอย่างส่วนขยาย Chrome และส่วนขยาย WebLLM ใน Chrome เพื่อดูวิธีใช้ WebGPU ใน Service Worker ของส่วนขยาย

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

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

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

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

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

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

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

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

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

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

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

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