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

François Beaufort
François Beaufort

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

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

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

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

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 โดยใช้พอยน์เตอร์ไปยังอะตอม

เราได้เพิ่มฟังก์ชัน 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 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