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

François Beaufort
François Beaufort

การทดสอบกลุ่มย่อย

ฟีเจอร์กลุ่มย่อยเปิดใช้การทำงานแบบขนานระดับ SIMD ซึ่งช่วยให้เธรดภายในกลุ่มสื่อสารและดำเนินการทางคณิตศาสตร์แบบรวมได้ (เช่น การคำนวณผลรวมของตัวเลข 16 รายการ) ซึ่งถือเป็นรูปแบบการแชร์ข้อมูลข้ามเธรดที่มีประสิทธิภาพสูง

การใช้งาน proposal ของกลุ่มย่อยขั้นต่ำพร้อมให้ใช้งานแล้วสำหรับการทดสอบในเครื่องหลังการตั้งค่าสถานะ "การรองรับ WebGPU ที่ไม่เป็นอันตราย" ที่ chrome://flags/#enable-unsafe-webgpu

นอกจากนี้ คุณยังลองใช้กลุ่มย่อยในเว็บไซต์กับผู้ใช้จริงได้โดยลงชื่อสมัครใช้ช่วงทดลองใช้เวอร์ชันที่ใช้งานจริง อ่านเริ่มต้นใช้งานการทดสอบต้นทางเพื่อดูวิธีการเตรียมเว็บไซต์ให้ใช้การทดสอบต้นทาง ช่วงทดลองใช้จากต้นทางจะเริ่มต้นจาก Chrome 128 ถึง 131 (สิ้นสุดวันที่ 19 กุมภาพันธ์ 2025) ดูความตั้งใจที่จะทดสอบ

เมื่อฟีเจอร์ "subgroups" พร้อมใช้งานใน GPUAdapter แล้ว ให้ขอ GPUDevice ที่มีฟีเจอร์นี้เพื่อรับการสนับสนุนกลุ่มย่อยใน WGSL และตรวจสอบขีดจํากัด minSubgroupSize และ maxSubgroupSize

นอกจากนี้ คุณยังต้องเปิดใช้ส่วนขยายนี้ในโค้ด WGSL อย่างชัดแจ้งด้วย enable subgroups; เมื่อเปิดใช้แล้ว คุณจะได้รับสิทธิ์เข้าถึงฟีเจอร์เพิ่มเติมต่อไปนี้

  • subgroup_invocation_id: ค่าในตัวสำหรับดัชนีของชุดข้อความภายในกลุ่มย่อย
  • subgroup_size: ค่าในตัวสำหรับการเข้าถึงขนาดกลุ่มย่อย
  • subgroupBallot(value): แสดงชุดช่องบิตที่บิตที่สอดคล้องกับ subgroup_invocation_id เป็น 1 หาก value เป็นจริงสําหรับการเรียกใช้ที่ใช้งานอยู่นั้น และแสดงเป็น 0 ในกรณีอื่น
  • subgroupBroadcast(value, id): ออกอากาศ value จากคําเรียกที่มี subgroup_invocation_id ตรงกับ id ไปยังคําเรียกทั้งหมดภายในกลุ่มย่อย หมายเหตุ: id ต้องเป็นค่าคงที่เวลาคอมไพล์

เราจะเพิ่มฟังก์ชันในตัวอื่นๆ เช่น subgroupAdd, subgroupAll, subgroupElect, subgroupShuffle ในอนาคต ดูปัญหา 354738715

หากต้องการอนุญาตการดำเนินการ f16 ในกลุ่มย่อย ให้ขอ GPUDevice ที่มีฟีเจอร์ "subgroups", "subgroups-f16" และ "shader-f16" จากนั้นเปิดใช้ในโค้ด WGSL ด้วย enable f16, subgroups, subgroups_f16;

ข้อมูลโค้ดต่อไปนี้เป็นพื้นฐานในการทดลองและค้นพบศักยภาพของกลุ่มย่อย

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

// Send the appropriate commands to the GPU...

เลิกใช้งานการตั้งค่าความเอียงของภาพสำหรับเส้นและจุด

การเปลี่ยนแปลงข้อกำหนดของ WebGPU ทำให้การตั้งค่า depthBias, depthBiasSlopeScale และ depthBiasClamp เป็นค่าที่ไม่ใช่ 0 เป็นข้อผิดพลาดในการตรวจสอบเมื่อโทโพโลยีของไปป์ไลน์การแสดงผลเป็นประเภทเส้นหรือจุด ระบบจะแสดงคำเตือนในคอนโซลเครื่องมือสำหรับนักพัฒนาเว็บเกี่ยวกับการตรวจสอบที่กําลังจะเกิดขึ้นนี้ และบังคับให้ค่าเป็น 0 ในกรณีเหล่านี้เพื่อให้นักพัฒนาแอปมีเวลาเพียงพอในการอัปเดตโค้ด ดูปัญหา 352567424

ซ่อนคำเตือนข้อผิดพลาดที่เครื่องมือสำหรับนักพัฒนาเว็บไม่ได้บันทึกไว้หาก preventDefault

ในคอนโซลเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ คำเตือนสําหรับเหตุการณ์ uncapturederror จะไม่แสดงอีกต่อไปหากมีการลงทะเบียน Listener เหตุการณ์สําหรับ uncapturederror และมีการเรียกใช้เมธอดเหตุการณ์ preventDefault() ภายใน Callback ของ Listener เหตุการณ์ ลักษณะการทํางานนี้ตรงกับการจัดการเหตุการณ์ใน JavaScript โปรดดูตัวอย่างต่อไปนี้และปัญหา 40263619

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

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

WGSL จะประมาณการสุ่มตัวอย่างก่อน แล้วทำอย่างใดอย่างหนึ่งต่อไปนี้

แอตทริบิวต์ WGSL interpolate ช่วยให้คุณจัดการการอินเตอร์โพเลชันข้อมูล IO ที่ผู้ใช้กำหนดได้ ตอนนี้พารามิเตอร์การสุ่มตัวอย่างแบบอินเตอร์โพเลตใหม่ first (ค่าเริ่มต้น) และ either ช่วยให้คุณควบคุมเพิ่มเติมได้ โดย first จะใช้ค่าจากจุดยอดแรกของพรีมิทีฟ ส่วน either จะใช้จุดยอดแรกหรือจุดยอดสุดท้ายก็ได้ ดูปัญหา 340278447

การอัปเดต Dawn

การติดตั้งใช้งาน WGPUFuture ของ Dawn เพื่อจัดการการดำเนินการแบบไม่พร้อมกันเสร็จสมบูรณ์แล้ว แนวคิดสําคัญ ได้แก่ wgpuInstanceProcessEvents สําหรับการประมวลผลเหตุการณ์แบบมีโอกาส และ WGPUCallbackMode สําหรับการกําหนดตําแหน่งการเรียกกลับ WGPUFuture หมายถึงเหตุการณ์ที่เกิดขึ้นเพียงครั้งเดียวซึ่งมีอายุการใช้งานแบบไม่จำกัด และ wgpuInstanceWaitAny จะรอให้การดำเนินการในอนาคตเสร็จสมบูรณ์หรือรอให้หมดเวลา ดูปัญหา 42240932

ตอนนี้ Surface::GetCapabilities() ไม่ได้รายงานค่า CompositeAlphaMode::Auto รหัสดังกล่าวยังคงใช้งานได้และเทียบเท่ากับ Surface::GetCapabilities().alphaMode[0] โปรดดูปัญหา 292

ตอนนี้แบ็กเอนด์ OpenGL รองรับ Surface ด้วย blit แบบพลิก Y สําหรับการเรียก Present() แต่ละครั้ง ดูปัญหา 344814083

เลิกใช้งานเมธอด Adapter::GetProperties() แล้วเพื่อใช้ Adapter::GetInfo() แทน

Jaswant ผู้มีส่วนร่วมภายนอกได้เขียนไฟล์ CMake ทั้งหมดขึ้นใหม่ ทำให้อัปเดตได้ง่ายขึ้นและอนุญาตให้สร้างก่อนการคอมไพล์ได้ ดูคู่มือเริ่มใช้งานฉบับย่อสำหรับการใช้ Dawn ในโปรเจ็กต์ CMake

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

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

รายการทุกอย่างที่ครอบคลุมในชุดมีอะไรใหม่ใน 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