תאריך פרסום: 3 ביוני 2025
ההטמעה של WebGPU API ב-Chrome כוללת תכונות שמיועדות רק לפיתוח ולבדיקות. התכונות האלה לא נכללות במפרט הרגיל של WebGPU. אין להשתמש בתכונות האלה בסביבת הייצור.
במאמר הזה מוסבר איך להפעיל תכונות למפתחים של WebGPU, ומוצגת רשימה מקיפה שלהן.
דרישות מוקדמות
כדי להפעיל את תכונות הפיתוח של WebGPU ב-Chrome, פועלים לפי השלבים הבאים:
- מפעילים את התכונה הניסיונית "WebGPU Developer Features" ב-
chrome://flags/#enable-webgpu-developer-features. - מפעילים מחדש את דפדפן Chrome.
השבתת קוונטיזציה של שאילתות שכוללות חותמות זמן
שאילתות של חותמות זמן מאפשרות לאפליקציות WebGPU למדוד בצורה מדויקת (עד לרמת הננו-שנייה) את זמן הביצוע של פקודות GPU במהלך מעברים של חישוב ועיבוד. השאילתות האלה חיוניות לניתוח הביצועים וההתנהגות של עומס העבודה של ה-GPU. לפרטים נוספים, אפשר לעיין במאמר בנושא שאילתות של חותמות זמן במעברים של חישוב ועיבוד.
בגלל חששות לגבי מתקפת תזמון, שאילתות של חותמות זמן עוברות קוונטיזציה ברזולוציה של 100 מיקרו-שניות, שמספקת פשרה טובה בין דיוק לאבטחה. הכימות הזה מושבת באופן אוטומטי כשמופעל הדגל WebGPU Developer Features (תכונות למפתחים של WebGPU).
מידע מורחב על המתאם
כדי להבין יותר לעומק את המתאם שבו נעשה שימוש, GPUAdapterInfo חושף את המאפיינים הבאים:
- המאפיין
device(סטנדרטי) הוא מזהה מתאם ספציפי לספק. - המאפיין
description(בתקן) הוא מחרוזת שניתנת לקריאה על ידי בני אדם ומספקת פרטים על המתאם. - המאפיין
driver(לא סטנדרטי) הוא מחרוזת שמתארת את הנהג, שאנשים יכולים לקרוא. - המאפיין
backend(לא סטנדרטי) מציין את קצה העורף של הגרפיקה, כמו"WebGPU","D3D11","D3D12","metal","vulkan","openGL","openGLES"או"null". - המאפיין
type(לא סטנדרטי) מזהה את סוג ה-GPU: "discrete GPU","integrated GPU","CPU"או"unknown". - המאפיין
d3dShaderModel(לא סטנדרטי) מציין את המספר המקסימלי של מודל הצללה D3D שנתמך. לדוגמה, 62 מציין תמיכה ב-HLSL SM 6.2. - המאפיין
vkDriverVersion(לא סטנדרטי) הוא גרסת מנהל ההתקן של Vulkan שצוינה על ידי הספק. - המאפיין
powerPreference(לא סטנדרטי) הוא"low-power"או"high-performance", על סמך GPUPowerPreference ב-GPURequestAdapterOptions.
כדי לצפות מראש מגבלות זיכרון כשמקצים כמויות גדולות במהלך פיתוח האפליקציה, GPUAdapterInfo חושף memoryHeaps מידע לא סטנדרטי, כמו הגודל והסוג של ערימות הזיכרון שזמינות במתאם.
const adapter = await navigator.gpu.requestAdapter();
for (const { size, properties } of adapter.info.memoryHeaps) {
console.log(size); // memory heap size in bytes
if (properties & GPUHeapProperty.DEVICE_LOCAL) { /* ... */ }
if (properties & GPUHeapProperty.HOST_VISIBLE) { /* ... */ }
if (properties & GPUHeapProperty.HOST_COHERENT) { /* ... */ }
if (properties & GPUHeapProperty.HOST_UNCACHED) { /* ... */ }
if (properties & GPUHeapProperty.HOST_CACHED) { /* ... */ }
}
אפשרות קימפול "מתימטיקה בלבד" של מודול תוכנת הצללה (shader)
GPUShaderModuleDescriptor כולל אפשרות בוליאנית strictMath לא סטנדרטית, שמאפשרת להפעיל או להשבית דיוק מתמטי מחמיר במהלך קומפילציה של מודול shader. האפשרות הזו נתמכת ב-Metal וב-Direct3D. כשמפעילים את strictMath, הקומפיילר פועל לפי כללים מתמטיים מדויקים. לעומת זאת, השבתה של האפשרות הזו מאפשרת לקומפיילר לבצע אופטימיזציה של הצללות על ידי:
- הפונקציה מתעלמת מהאפשרות של ערכי NaN ואינסוף.
- התייחסות ל-0 כאל +0.
- החלפת פעולת החילוק בפעולת כפל מהירה יותר במספר ההופכי.
- סידור מחדש של פעולות על סמך תכונות אסוציאטיביות ודיסטריבוטיביות.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const code = `
// Examines the bit pattern of the floating-point number to
// determine if it represents a NaN according to the IEEE 754 standard.
fn isNan(x : f32) -> bool {
bool ones_exp = (bitcast<u32>(x) & 0x7f8) == 0x7f8;
bool non_zero_sig = (bitcast<u32>(x) & 0x7ffff) != 0;
return ones_exp && non_zero_sig;
}
// ...
`;
// Enable strict math during shader compilation.
const shaderModule = device.createShaderModule({ code, strictMath: true });
ייבוא סרטון ללא העתקה
המאפיין הבוליאני הלא-סטנדרטי GPUExternalTexture isZeroCopy מאפשר לדעת אם ה-GPU ניגש ישירות לסרטון שיובא באמצעות importExternalTexture(), בלי צורך בעותק ביניים.
const adapter = await navigator.gpu.requestAdapter();
const device = await adapter.requestDevice();
const video = document.querySelector('video');
const externalTexture = device.importExternalTexture({ source: video });
if (externalTexture.isZeroCopy) {
console.log('Video frame was accessed directly by the GPU');
}