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

François Beaufort
François Beaufort

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

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

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

השינוי הזה מפשט את הלוגיקה של הצללה בצינורות של אפקטים בווידאו, שבהם צריך לטפל גם ב-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 באמצעות מצביע ל-atomic

נוספה עומס יתר (overload) חדש של 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 (תכונות למפתחים של 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.

עדכונים לגבי שעות השחר

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

‫Emdawnwebgpu הוא פיצול (שמתוחזק) של הקישורים המובנים (USE_WEBGPU) של Emscripten (שכבר לא מתוחזק). כל הפיתוחים החדשים מתבצעים ב-Emdawnwebgpu, והקישורים המובנים של Emscripten יוסרו כשהמפתחים יעברו ל-Emdawnwebgpu. קובץ הכותרת של Emdawnwebgpu ב-C דומה מאוד לזה של 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