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

François Beaufort
François Beaufort

תאריך פרסום: 29 בינואר 2025

פורמטים נוספים של קודקודים עם רכיב אחד ו-unnorm8x4-bgra

נוספו פורמט הנקודה "unorm8x4-bgra" ופורמטים של נקודות עם רכיב אחד: "uint8",‏ "sint8",‏ "unorm8",‏ "snorm8",‏ "uint16",‏ "sint16",‏ "unorm16",‏ "snorm16" ו-"float16". פורמט הנקודות "unorm8x4-bgra" מאפשר לטעון בצורה נוחה יותר צבעים של נקודות בקידוד BGRA תוך שמירה על אותו שדה. בנוסף, פורמט קודקוד עם רכיב אחד מאפשר לבקש רק את הנתונים הנחוצים, בעוד שבעבר נדרשו לפחות פי שניים יותר נתונים עבור סוגי נתונים של 8 ו-16 ביט. אפשר לעיין ברשומה ב-chromestatus ובבעיה 376924407.

מתן הרשאה לבקש הגבלות לא ידועות עם ערך לא מוגדר

כדי שה-WebGPU API יהיה פחות שברירי במהלך הפיתוח שלו, עכשיו אפשר לבקש מגבלות לא ידועות עם הערך undefined כשמבקשים מכשיר GPU. לדוגמה, האפשרות הזו מועילה בקוד האפליקציה הבא, שבו adapter.limits.someLimit יכול להיות undefined אם someLimit כבר לא קיים. spec PR 4781

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

שינויים בכללי ההתאמה של WGSL

אי אפשר יותר לספק ערך יישור קטן מדי למאפיין של מבנה, כי עכשיו נדרש ש-@align(n) יחלק את RequiredAlignOf לכל המבנים. השינוי המשמעותי הזה מפשט את השימוש בשפת WGSL ועוזר לשפר את התאימות שלה ל-Firefox ול-Safari. בבקשת העריכה (PR) של המפרט אפשר למצוא קוד לדוגמה שמראה את ההבדלים בין המהדרים של Tint,‏ Naga ו-WebKit.

שיפור בביצועים של WGSL באמצעות ביטול נתונים

בגלל ירידה משמעותית בביצועים שנצפתה בזמן עיבוד גרפי של אפקט מורכב של שיקוף במרחב המסך (SSR), ההטמעה של הצהרת הביטול משתמשת בסמינטיקה שסופקו על ידי הפלטפורמה כדי להוריד את הקריאה לפעולה לעזרה כשהיא זמינה. כך אפשר לשפר את הביצועים של שגיאות שמשתמשות ב-discard. בעיה מס' 372714384

שימוש ב-displaySize של VideoFrame למרקמים חיצוניים

צריך להשתמש במאפיינים displayWidth ו-displayHeight כגודל המשוער של GPUExternalTexture כשמייבאים VideoFrame בהתאם למפרט WebGPU. עם זאת, הגודל הגלוי היה בשימוש שגוי וגרם לבעיות כשניסינו להשתמש ב-textureLoad() ב-GPUExternalTexture. השגיאה תוקנה. בעיה מס' 377574981

טיפול בתמונות בכיוונים שאינם ברירת המחדל באמצעות copyExternalImageToTexture

שיטת copyExternalImageToTexture() GPUQueue משמשת להעתקת התוכן של תמונה או קנבס למרקם. עכשיו הוא מטפל כראוי בתמונות עם כיוונים שאינם כיוון ברירת המחדל. בעבר, המצב היה שונה כשהמקור היה ImageBitmap עם imageOrientation "from-image" או תמונה עם כיוון שונה מברירת המחדל. בעיה מס' 384858956

שיפור חוויית המפתחים

יכול להיות שתופתע כשהערך של adapter.limits יהיה גבוה, אבל לא תדעו שצריך לבקש במפורש מגבלה גבוהה יותר כשמבקשים מכשיר GPU. אם לא תעשו זאת, יכול להיות שתגיעו למגבלות באופן בלתי צפוי בשלב מאוחר יותר.

כדי לעזור לכם, הוספנו להודעות השגיאה רמזים שמציינים שצריך לבקש במפורש מגבלה גבוהה יותר אם לא צוינה מגבלה ב-requiredLimits בזמן הקריאה ל-requestDevice(). בעיה מס' 42240683

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

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

הפעלת מצב תאימות באמצעות featureLevel

עכשיו אפשר לבקש מתאם GPU במצב תאימות ניסיוני על ידי הגדרת האפשרות הסטנדרטית featureLevel לערך "compatibility". המחרוזות "core" (ברירת המחדל) ו-"compatibility" הן הערכים היחידים שמותר להשתמש בהם. אפשר לעיין בדוגמה הבאה ובבקשת התיקון 4897.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

האפשרות featureLevel מחליפה את האפשרות compatibilityMode שאינה סטנדרטית, והמאפיין featureLevel שאינו סטנדרטי מחליף את המאפיין isCompatibilityMode.

מכיוון שהתכונה עדיין נמצאת בגרסת ניסוי, צריך להריץ את Chrome עם הדגל 'תמיכה לא בטוחה ב-WebGPU' בכתובת chrome://flags/#enable-unsafe-webgpu בינתיים. אתם יכולים לנסות את הכלי באתר webgpureport.org.

ניקוי של תכונות ניסיוניות של קבוצות משנה

התכונות הניסיוניות של קבוצות המשנה "chromium-experimental-subgroups" ו-"chromium-experimental-subgroup-uniform-control-flow" יוצאו משימוש. בעיה מס' 377868468

התכונה הניסיונית "subgroups" היא כל מה שדרוש לכם עכשיו כשאתם מבצעים ניסויים עם קבוצות משנה. התכונה הניסיונית "subgroups-f16" הוצאה משימוש ויוסר בקרוב. אפשר להשתמש בערכי f16 עם קבוצות משנה כשהבקשה של האפליקציה כוללת גם את התכונות "shader-f16" וגם את התכונות "subgroups". בעיה מס' 380244620

הוצאה משימוש של המגבלה maxInterStageShaderComponents

המגבלה maxInterStageShaderComponents הוצאה משימוש בגלל שילוב של גורמים:

  • יתירות עם maxInterStageShaderVariables: המגבלה הזו כבר משמשת למטרה דומה, היא קובעת את כמות הנתונים המועברים בין שלבי ה-shader.
  • אי-התאמות קלות: יש הבדלים קלים באופן שבו שתי המגבלות מחושבות, אבל ההבדלים האלה הם קלים וניתן לנהל אותם ביעילות במסגרת המגבלה maxInterStageShaderVariables.
  • פשטות: הסרת maxInterStageShaderComponents משפרת את ממשק ה-shader ומפחיתה את המורכבות עבור המפתחים. במקום לנהל שתי מגבלות נפרדות עם הבדלים עדינים, הם יכולים להתמקד במגבלה maxInterStageShaderVariables שמתאימה יותר לשם שלה ומקיפה יותר.

המטרה היא להסיר אותו לחלוטין בגרסה 135 של Chrome. אפשר לעיין בכוונה להוצאה משימוש ובבעיה 364338810.

עדכונים של Dawn

ה-wgpu::Device::GetAdapterInfo(adapterInfo) מאפשר לקבל את פרטי המתאם ישירות מ-wgpu::Device. בעיה מס' 376600838

שם המבנה WGPUProgrammableStageDescriptor השתנה ל-WGPUComputeState כדי שהמצב של המחשוב יהיה עקבי עם המצבים של הנקודות והשברים. בעיה מס' 379059434

ערך ה-enum wgpu::VertexStepMode::VertexBufferNotUsed הוסר. עכשיו אפשר להשתמש ב-{.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} כדי לציין פריסה של מאגר קודקודים שלא בשימוש. בעיה מס' 383147017

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

מה חדש ב-WebGPU

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

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