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

François Beaufort
François Beaufort

เผยแพร่: 26 พฤษภาคม 2025

ใช้มุมมองพื้นผิวสำหรับการเชื่อมโยง ExternalTexture

ตอนนี้ระบบอนุญาตให้ใช้ GPUTextureView ที่เข้ากันได้ (2 มิติ ทรัพยากรย่อยเดียว) แทนการเชื่อมโยง GPUExternalTexture เมื่อสร้าง GPUBindGroup

ซึ่งจะช่วยลดความซับซ้อนของตรรกะของ Shader ในไปป์ไลน์เอฟเฟกต์วิดีโอที่ต้องจัดการทั้ง GPUExternalTexture (สำหรับวิดีโอต้นฉบับ) และ GPUTextureView (สำหรับการประมวลผลขั้นกลาง) นอกจากนี้ ยังช่วยลดความจำเป็นในการคอมไพล์ Shader แบบไดนามิกโดยขึ้นอยู่กับว่า Texture มาจากที่ใด ดูความตั้งใจที่จะเปิดตัว: WebGPU: GPUTextureView สำหรับการเชื่อมโยง ExternalTexture

const texture = myDevice.createTexture({
  size: [42, 42],
  format: navigator.gpu.getPreferredCanvasFormat(),
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

const code = `
@group(0) @binding(0) var texture : texture_external;
@group(0) @binding(1) var<storage, read_write> buffer: vec2u;
    
@compute @workgroup_size(1) fn main() {
  buffer = textureDimensions(texture);
}`;

const pipeline = myDevice.createComputePipeline({
  layout: "auto",
  compute: { module: myDevice.createShaderModule({ code }) },
});

const bindGroup = myDevice.createBindGroup({
  layout: pipeline.getBindGroupLayout(0),
  entries: [
    { binding: 0, resource: texture.createView() }, // Use texture view for an externalTexture binding
    { binding: 1, resource: { buffer: myBuffer } },
  ],
});

คัดลอกบัฟเฟอร์โดยไม่ต้องระบุออฟเซ็ตและขนาด

การโอเวอร์โหลดเมธอด GPUCommandEncoder ใหม่ช่วยให้นักพัฒนาซอฟต์แวร์ละเว้นพารามิเตอร์ออฟเซ็ตและขนาดได้เมื่อใช้ copyBufferToBuffer() เพื่อลดความซับซ้อนในการคัดลอกบัฟเฟอร์ทั้งหมด ดูIntent to Ship: WebGPU: copyBufferToBuffer overload

const size = 42;
const srcBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});
const dstBuffer = myDevice.createBuffer({
  size,
  usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
});

// Copy entire buffer.
myCommandEncoder.copyBufferToBuffer(srcBuffer, dstBuffer);

// This is the same as the following.
// myCommandEncoder.copyBufferToBuffer(srcBuffer, 0, dstBuffer, 0, size);

WGSL workgroupUniformLoad โดยใช้ Pointer ไปยังอะตอม

เราได้เพิ่มโอเวอร์โหลด workgroupUniformLoad(ptr) ใหม่ใน WGSL เพื่ออำนวยความสะดวกแก่นักพัฒนาแอป โดยจะโหลดค่าที่ ptr ชี้แบบอะตอมมิก และส่งคืนค่าดังกล่าวไปยังการเรียกใช้ทั้งหมดในเวิร์กกรุ๊ป ซึ่ง ptr เป็นพอยน์เตอร์ไปยังอะตอมมิกภายในตัวแปรเวิร์กกรุ๊ป ดูปัญหา 408241039

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

var<workgroup> wgvar : atomic<u32>;

@compute @workgroup_size(1, 1)
fn main(@builtin(local_invocation_index) lid: u32) {
  if (lid == 0) {
    atomicStore(&(wgvar), 42u);
  }
  buffer[lid] = workgroupUniformLoad(&wgvar);
}

แอตทริบิวต์ powerPreference ของ GPUAdapterInfo

ตอนนี้แอตทริบิวต์สตริง powerPreference GPUAdapterInfo ที่ไม่ใช่มาตรฐานพร้อมใช้งานแล้วเมื่อผู้ใช้เปิดใช้แฟล็ก "ฟีเจอร์สำหรับนักพัฒนาซอฟต์แวร์ WebGPU" ที่ chrome://flags/#enable-webgpu-developer-features หากรองรับ ค่า powerPreference อาจเป็น "low-power" หรือ "high-performance" ขึ้นอยู่กับค่า GPUPowerPreference ที่ใช้ใน GPURequestAdapterOptions ดู CL 6438860

function checkPowerPreferenceForGpuDevice(device) {
  const powerPreference = device.adapterInfo.powerPreference;
  if (powerPreference === "high-performance") {
    // High-performance GPU detected. Enabling enhanced graphics settings.
  } else if (powerPreference === "low-power") {
    // Low-power GPU detected. Optimizing for battery life.
  }
}

นำแอตทริบิวต์ compatibilityMode ของ GPURequestAdapterOptions ออก

เราได้นำแอตทริบิวต์ compatibilityMode ของ GPURequestAdapterOptions แบบทดลองออกแล้วเพื่อใช้แอตทริบิวต์ featureLevel ที่ได้มาตรฐานแทน ซึ่งเราได้เพิ่มแอตทริบิวต์นี้ใน Chrome 133 ดูปัญหา 366151404

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

นักพัฒนาแอปสามารถสร้างโปรเจ็กต์ WebGPU ในภาษาต่างๆ เช่น C++ โดยใช้ webgpu.h เพื่อกำหนดเป้าหมายทั้ง WebAssembly และแพลตฟอร์มที่เฉพาะเจาะจง "emdawnwebgpu" ("Emscripten Dawn WebGPU") ที่ Dawn เพิ่งเปิดตัวใช้ webgpu.h ที่ได้มาตรฐานล่าสุดผ่าน API ของเบราว์เซอร์

Emdawnwebgpu เป็น Fork (ที่ได้รับการดูแล) ของการเชื่อมโยงในตัว (USE_WEBGPU) ของ Emscripten (ปัจจุบันไม่มีการดูแลแล้ว) การพัฒนาใหม่ทั้งหมดจะดำเนินการใน emdawnwebgpu และระบบจะนำการเชื่อมโยงในตัวของ Emscripten ออกเมื่อนักพัฒนาแอปเปลี่ยนไปใช้ emdawnwebgpu ส่วนหัว C ของ Emdawnwebgpu นั้นใกล้เคียงกับของ Dawn มาก ในขณะที่การเชื่อมโยงในตัวนั้นล้าสมัยไปมาก

ดาวน์โหลด emdawnwebgpu จากหน้าการเผยแพร่ของ Dawn ใน GitHub และอ่าน README.md ของแพ็กเกจเพื่อดูข้อมูลเกี่ยวกับวิธีใช้งาน คุณดูไฟล์ต้นฉบับได้ในที่เก็บ Dawn

ดูคำแนะนำฉบับสมบูรณ์ได้ในเอกสารประกอบสร้างแอปด้วย WebGPU ที่ปรับปรุงแล้ว

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

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

รายการทุกอย่างที่ครอบคลุมในซีรีส์มีอะไรใหม่ใน WebGPU

Chrome 149-150

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