מה חדש ב-WebGPU (גרסה 137 של Chrome)

François Beaufort
François Beaufort

תאריך פרסום: 26 במאי 2025

שימוש בתצוגת המרקם לקישור של externalTexture

עכשיו מותר להשתמש ב-GPUTextureView תואם (2D, משאב משנה יחיד) במקום קישור של GPUExternalTexture כשיוצרים GPUBindGroup.

כך אפשר לפשט את הלוגיקה של שדרן (shader) בצינורות עיבוד של אפקטים לווידאו, שבהם צריך לטפל גם ב-GPUExternalTexture (לסרטון המקור) וגם ב-GPUTextureView (לעיבוד ביניים). בנוסף, היא מפחיתה את הצורך לבצע הידור דינמי של שגיאות בהתאם למקור של המרקם. אפשר לעיין במאמר Intent to Ship: WebGPU: GPUTextureView for externalTexture binding.

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 to atomic

הוספנו עומס יתר חדש של 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 Developer Features' ב-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 שנוסף בגרסה 133 של Chrome. בעיה מס' 366151404

עדכונים בנושא Dawn

מפתחים יכולים ליצור פרויקטים של WebGPU בשפות כמו C++‎, ולהשתמש ב-webgpu.h כדי לטרגט גם את WebAssembly וגם פלטפורמות ספציפיות. ב-emdawnwebgpu (Emscripten Dawn WebGPU) שפורסם לאחרונה על ידי Dawn, מוטמעת הגרסה העדכנית ביותר של webgpu.h דרך ה-API של הדפדפן.

Emdawnwebgpu הוא פורק (מתוחזק) של קישורי Emscripten המובנים (USE_WEBGPU) (שאינם מתוחזקים עכשיו). כל הפיתוח החדש מתבצע ב-emdawnwebgpu, והקישורים המובנים של Emscripten יוסרו כשהמפתחים יעברו ל-emdawnwebgpu. הכותרת של Emdawnwebgpu ב-C דומה מאוד לזו של Dawn, אבל הקישורים המובנים מיושנים מאוד.

מורידים את emdawnwebgpu מדף הגרסאות של Dawn ב-GitHub וקוראים את README.md של החבילה כדי לקבל מידע על השימוש בה. קובצי המקור נמצאים במאגר Dawn.

למדריך מלא, אפשר לעיין במסמכי התיעוד המעודכנים בנושא פיתוח אפליקציות באמצעות WebGPU.

כאן מפורטות רק חלק מהנקודות העיקריות. רשימת ההצהרות המלאה

מה חדש ב-WebGPU

רשימה של כל מה שנדון בסדרה מה חדש ב-WebGPU.

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