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

François Beaufort
François Beaufort

การทดลองใช้กลุ่มย่อย

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

การใช้งานข้อเสนอแนะเกี่ยวกับกลุ่มย่อยแบบมินิมัลพร้อมให้ทดสอบในเครื่องแล้วโดยซ่อนไว้หลังแฟล็ก "Unsafe WebGPU Support" ที่ chrome://flags/#enable-unsafe-webgpu

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

เมื่อฟีเจอร์ "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

ในคอนโซล DevTools ระบบจะไม่แสดงคำเตือนสำหรับเหตุการณ์ uncapturederror อีกต่อไป หากมีการลงทะเบียน Listener เหตุการณ์สำหรับ uncapturederror และมีการเรียกใช้เมธอด Event 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 interpolate sampling first and either

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

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

การใช้งาน WGPUFuture ของ Dawn เพื่อจัดการการดำเนินการแบบไม่พร้อมกันเสร็จสมบูรณ์แล้ว แนวคิดหลัก ได้แก่ wgpuInstanceProcessEvents สำหรับการประมวลผลเหตุการณ์แบบโอกาส และ WGPUCallbackMode สำหรับการกำหนดตำแหน่ง Callback 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 147-148

Chrome 146

Chrome 145

Chrome 144

Chrome 143

Chrome 142

Chrome 141

Chrome 140

Chrome 139

Chrome 138

Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

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