מה חדש ב-WebGPU‏ (Chrome 149-150)

François Beaufort
François Beaufort

תאריך פרסום: 17 ביוני 2026

Immediates

משתנים מיידיים, שנקראים גם קבועים של push או קבועים של root, מאפשרים להעביר כמויות קטנות של נתונים שמשתנים לעיתים קרובות ישירות לשיידרים. התהליך הזה מדלג על התקורה של יצירת מאגרי GPU וניהול קבוצות קשירה.

עדכון של קשרי קישור של מאגר אחיד לנתונים שמשתנים בכל בקשה להזזת פריט גרפי (draw call) – כמו מזהה אובייקט ייחודי או מטריצת טרנספורמציה תלת-ממדית למאות אובייקטים – יוצר תקורה של מעבד (CPU). החדרת ערכים גולמיים ישירות למקודד הכרטיס כדי להימנע מכתיבת נתונים לזיכרון ומניהול של חיפושים ב-GPU.

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

ב-shader של WGSL, מרחב הכתובות <immediate> מאפשר להגדיר נתונים מיידיים שאפשר להעביר ישירות למקודד המעבר. קוראים ל-setImmediates() ב-JavaScript לפני בקשה להזזת פריט גרפי (draw call) כדי לספק את הנתונים האלה בלי לקשר קבוצה. כדי לבדוק אם יש תמיכה, צריך לזהות את התכונה של תוסף השפה immediate_address_space WGSL באמצעות navigator.gpu.wgslLanguageFeatures. אפשר לעיין בדוגמה הבאה ובהודעה על כוונה להשיק.

if (!navigator.gpu.wgslLanguageFeatures.has('immediate_address_space')) {
   throw new Error(`WGSL immediate address space is not available`);
}

const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();

const module = device.createShaderModule({ code: `
  requires immediate_address_space;

  var<immediate> color: vec4f;

  @vertex fn vertexMain(@builtin(vertex_index) i : u32) -> @builtin(position) vec4f {
    const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
    return vec4f(pos[i], 0, 1);
  }

  @fragment fn fragmentMain() -> @location(0) vec4f {
    return color;
  }`,
});

// Create render pass encoder (omitted)...

// By using layout: 'auto', WebGPU will automatically infer the `immediateSize`
// required by the pipeline layout from the WGSL module.
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});
myRenderPassEncoder.setPipeline(pipeline);

// Send immediate data to the GPU, then issue a draw call
myRenderPassEncoder.setImmediates(/*rangeOffset=*/0, new Float32Array([255, 0, 0, 255]));
myRenderPassEncoder.draw(3);
myRenderPassEncoder.end();

כדי לקבל מידע נוסף על התכונה הזו, אפשר לעיין במאמר WebGPUFundamentals Immediates.

תודה לצוות ב-Microsoft על התרומה שלהם!

אימות מחמיר יותר של קבצים מצורפים זמניים

לאחרונה נוסף ל-WebGPU הדגל TRANSIENT_ATTACHMENT GPUTextureUsage, שמאפשר למפתחים ליצור קבצים מצורפים זמניים לעיבוד, כמו מאגרי מידע של עומק וסטנסיל או יעדים עם דגימה מרובה. הקבצים המצורפים האלה נשארים בזיכרון המהיר של ה-Tile שבשבב, בלי להקצות VRAM ראשי.

בעדכונים האחרונים (מס' 6248 ומס' 6267) שופרו כללי האימות כדי למנוע שימוש לרעה בתוספי הטקסטורה האלה שצורכים פחות זיכרון:

  • בגלל מגבלות פלטפורמה, כשיוצרים טקסטורות זמניות, viewFormats חייב להיות מערך ריק. אין צורך בפורמטים חלופיים של תצוגה כי טקסטורות חולפות מיועדות רק לעיבוד.
  • יצירת תצוגת טקסטורה לא מצמצמת את דגלי השימוש. כשמתקשרים אל createView() בטקסטורה זמנית, התצוגה לא יכולה לשנות את השימוש שלה.
  • אי אפשר להשתמש בקבצים מצורפים זמניים כ-resolveTarget בתוך שלב עיבוד.

עדכונים של Dawn

המידע הזה כולל רק נקודות עיקריות. רשימה מלאה של קומיטים

מה חדש ב-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