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

François Beaufort
François Beaufort

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

ประเภทการเชื่อมโยงพื้นผิวพื้นที่เก็บข้อมูลช่วยให้ตัวปรับเฉดสีอ่านจากพื้นผิวพื้นที่เก็บข้อมูลได้โดยไม่ต้องเพิ่มการใช้งาน TEXTURE_BINDING รวมถึงทำการอ่านและเขียนแบบผสมในบางรูปแบบ เมื่อมีส่วนขยายภาษา WGSL ของ "readonly_and_readwrite_storage_textures" แสดงอยู่ใน 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; ที่ด้านบนของโค้ดตัวปรับแสง WGSL ดูตัวอย่างต่อไปนี้และปัญหารุ่งเช้า: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.

การสนับสนุนโปรแกรมทำงานของบริการและผู้ปฏิบัติงานที่ใช้ร่วมกัน

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 เนื่องจากเป็นข้อบกพร่องในการใช้งาน ซึ่งตอนนี้ได้รับการแก้ไขด้วยการทดสอบที่เหมาะสมแล้ว ดูปัญหารุ่งเช้า:2402

ข้อมูลอัปเดตเกี่ยวกับ Dawn

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

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

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

รายการของทุกอย่างที่มีการพูดถึงในซีรีส์มีอะไรใหม่ใน WebGPU

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