מה חדש ב-WebGPU‏ (Chrome 155-156)

תוסף fragment_depth של WGSL

במעברי רינדור שכוללים הרבה גיאומטריה, אופטימיזציות של early-Z הן החברות הכי טובות של המפתחים. הם משפרים את הביצועים באופן משמעותי בכך שהם מאפשרים ל-GPU למחוק פיקסלים מוסתרים לפני הפעלת הצללות פרגמנטים (fragment shaders) יקרות. אם עומק שעבר רסטריזציה נכשל בבדיקת העומק, ה-GPU מדלג על הצללת הפרגמנט לחלוטין, בתנאי שלצללה אין תופעות לוואי אחרות.

אם אתם רוצים לקרוא איך החומרה מטפלת בזה, ל-MJP יש מאמר מצוין בנושא מתי צריך להשבית את Early-Z?.

למרות ששינוי עומק בהתאמה אישית הוא שימושי, ביצוע שלו ב-fragment shader כרוך בעלות נסתרת. כתיבה אל @builtin(frag_depth) בתוך fragment shader בדרך כלל מאלצת את מנהלי ההתקנים להשבית את האופטימיזציות האלה של early-Z לכל הבקשה להזזת פריט גרפי. זה קורה כי היוריסטיקות של מנהל ההתקן לא יכולות להבטיח שעומק הפלט המחושב של ה-shader תואם לעומק שעבר אינטרפולציה על ידי הרסטריזציה.

כדי לטפל בפגיעה הזו בביצועים, התוסף fragment_depth של WGSL מאפשר לציין שם של מצב עומק less או greater ב-@builtin(frag_depth) כדי לציין במפורש איך העומק הכתוב משתווה לעומק שעבר אינטרפולציה, וכך לאפשר ל-GPU להחיל אופטימיזציות של early-Z באופן בטוח.

אפשר לזהות את התכונה של תוסף השפה הזה ב-JavaScript באמצעות navigator.gpu.wgslLanguageFeatures. מומלץ להשתמש בהוראת requires כדי לאותת על האפשרות של חוסר ניידות עם requires fragment_depth; בחלק העליון של קוד ה-shader של WGSL. אפשר לעיין בדוגמה הבאה ובהודעה על כוונה להשיק.

if (!navigator.gpu.wgslLanguageFeatures.has("fragment_depth")) {
  throw new Error(`WGSL fragment depth is not available`);
}

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

const shaderModule = device.createShaderModule({ code: `
  requires fragment_depth;

  @fragment
  fn main() -> @builtin(frag_depth, less) f32 {
    // Explicitly states that the output fragment depth is less than early-Z depth,
    // allowing the GPU to safely preserve early-Z optimizations.
    return 0.0f;
  }`,
});

דחיסת הטקסטורה לא מיושרת

התכונה texture-compression-unaligned של GPU מאפשרת ליצור טקסטורות דחוסות עם מימדים שהם לא כפולות של מספרים שלמים של גודל הבלוק (כמו 4x4 בפורמטים BC,‏ ETC2 ו-ASTC). בעבר, ב-WebGPU היה צריך להתאים את גודל הטקסטורה לגבולות הבלוקים האלה. התכונה הזו מייתרת את הצורך להוסיף ריפוד או לשנות את קנה המידה של הטקסטורות כדי להתאים אותן ליישור הבלוקים, וכך שומרת על נאמנות הדחיסה המקורית בלי לגרום לעיוותים בקנה המידה. הצהרת הכוונות להשקה

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

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("texture-compression-unaligned")) {
  throw new Error("Texture compression unaligned support is not available");
}
// Explicitly request texture compression unaligned support.
const device = await adapter.requestDevice({
  requiredFeatures: ["texture-compression-unaligned"],
});

תודה רבה לתורם החיצוני איגנסיו קסטניו מ-spark.js על הובלת התכונה, המפרט והעבודה על ה-CTS.

מרחבי הצבעים srgb-linear ו-display-p3-linear

הוספנו את מרחבי הצבעים המוגדרים מראש "srgb-linear" ו-"display-p3-linear", ועכשיו הקשר ה-canvas של WebGPU יכול לעבד ישירות למרחבי צבעים לינאריים בטווח מורחב כדי לתמוך במסכים עם סולם צבעים רחב. במרחבי הצבעים האלה נשמר קשר ליניארי בין ערכי הפיקסלים לבין הבהירות הפיזית. לכן הם אידיאליים לעיבוד תאורה פיזית במשחקים, וגם למשימות עיבוד מרחביות כמו החלקת קצוות (anti-aliasing), אינטרפולציה ודצימציה. אפשר לעיין בכוונת ההשקה ובבקשת המיזוג לדוגמה של Particles (HDR)‎‏ #574.

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

const canvas = document.querySelector("canvas");
const context = canvas.getContext("webgpu");

context.configure({
  device,
  format: "rgba16float",
  colorSpace: "display-p3-linear",
});

פורמט נוסף של snorm10-10-10-2 לוורטקסים

הפורמט "snorm10-10-10-2" לוורטקסים הוא פורמט דחוס של 32 ביט שמכיל ארבעה ערכים מנורמלים עם סימן: שלושה רכיבים של 10 ביט (r, g, b) ורכיב אחד של 2 ביט (a). הפורמט הזה מאפשר לאחסן ביעילות מאפיינים, כמו וקטורים נורמליים בתלת-ממד עם סקלר נוסף של 2 ביט, או דגל יישור, תוך חיסכון ברוחב הפס של הזיכרון. מידע נוסף זמין ב-spec PR 6491.

תמיכה ב-f16 ב-Linux ל-NVIDIA

התכונה האופציונלית "shader-f16", שמספקת תמיכה בערכי נקודה צפה (floating-point) של 16 ביט ב-WGSL, נתמכת עכשיו ב-Linux במנהלי התקנים (דרייברים) עדכניים של NVIDIA GPU. מידע נוסף

עדכונים של Dawn

עכשיו אפשר לשלוח שאילתה לגבי ה-LUID של ה-DXGIAdapter הבסיסי של מתאם GPU נתון באמצעות המבנה WGPUAdapterPropertiesD3D. מידע נוסף

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

מה חדש ב-WebGPU

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

‫Chrome 155-156

‫Chrome 153-154

‫Chrome 151-152

‫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