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

François Beaufort
François Beaufort

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

שימוש בתצוגת המרקם

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

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

אפשר לעיין בקטע הקוד הבא, ברשומה ב-chromestatus ובבעיה 363903526.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

מיזוג של טקסטורות של מספרים ממשיים (float) ב-32 ביט

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

התכונה החדשה של GPU‏ "float32-blendable" מאפשרת למזג טקסטורות של GPU בפורמטים "r32float",‏ "rg32float" ו-"rgba32float". עכשיו אפשר ליצור צינור עיבוד נתונים לעיבוד תמונה שמשתמש בערבוב עם כל קובץ מצורף בפורמט float32, כשמבקשים מכשיר GPU עם התכונה הזו.

אפשר לעיין בקטע הקוד הבא, ברשומה ב-chromestatus ובבעיה 369649348.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

המאפיין adapterInfo של GPUDevice

חשוב לספריות שמקבלות אובייקטים מסוג GPUDevice מהמשתמשים לגשת למידע על ה-GPU הפיזי, כי יכול להיות שיהיה צורך לבצע אופטימיזציה או להטמיע פתרונות חלופיים על סמך ארכיטקטורת ה-GPU. אפשר לגשת למידע הזה דרך האובייקט GPUAdapter, אבל אין דרך ישירה לקבל אותו מ-GPUDevice בלבד. הדבר עלול להיות לא נוח, כי יכול להיות שהמשתמשים יצטרכו לספק מידע נוסף לצד GPUDevice.

כדי לטפל בבעיה הזו, עכשיו אפשר לגשת ל-GPUAdapterInfo דרך המאפיין GPUDevice adapterInfo. הם דומים למאפיין GPUAdapter info הקיים.

אפשר לעיין בקטע הקוד הבא, ברשומה ב-chromestatus ובבעיה 376600838.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

הגדרת הקשר של לוח הציור בפורמט לא תקין גורמת לשגיאת JavaScript

בעבר, שימוש בפורמט טקסטורה לא תקין בשיטה configure() של הקשר הבד של GPU הוביל לשגיאת אימות של GPU. השינוי הוא הוספת הודעת שגיאה מסוג TypeError ב-JavaScript. כך אפשר למנוע תרחישים שבהם getCurrentTexture() מחזירה טקסטורה תקינה של GPU למרות שההקשר של קנבס ה-GPU מוגדר בצורה שגויה. מידע נוסף זמין בבעיה 372837859.

הגבלות על סינון של Sampler במרקמים

בעבר היה מותר להשתמש בפורמטים של טקסטורות "sint",‏ "uint" ו-depth" עם דגימות סינון. עכשיו אסור להשתמש בטקסטורה בפורמט "sint" או "uint" עם Sampler לסינון. שימו לב שבשלב הזה מתקבלת אזהרה אם משתמשים ב-texture‏ depth" עם sampler לסינון, כי השימוש הזה לא יהיה מורשה בעתיד. בעיה 376497143

ההגבלות האלה מחייבות ליצור באופן ידני פריסות של קבוצות קישור כשמשתמשים בטקסטורת עומק עם Sampler ללא סינון. הסיבה לכך היא שפריסות הקבוצות המקושרות שנוצרות באופן 'אוטומטי' עדיין לא תומכות בשילוב הזה. בעיה ב-Spec 4952 מכילה הצעה שנמצאת בבדיקה כדי לטפל במגבלה הזו בעתיד.

ניסוי מורחב בקבוצות משנה

הניסוי בקבוצות משנה, שהיה אמור להסתיים בגרסת Chrome 131, הוארך עד גרסת Chrome 133 ויסתיים ב-16 באפריל 2025. בתקופת הניסיון הראשונה בגרסת המקור, התמקדו בביצועים, אבל חסרו בה אמצעי הגנה חיוניים להעברה. אמצעי ההגנה האלה יתווספו עכשיו, ויכול להיות שהם יגרמו לשגיאות בקוד הקיים.

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

עכשיו מוצגת אזהרה בכלי הפיתוח כשמשתמשים באפשרות powerPreference עם requestAdapter() ב-Windows. האזהרה הזו תוסר כשמערכת Chrome תדע להשתמש בשני מעבדי GPU שונים ולשלב ביניהם את התוצאות. בעיה מס' 369219127

גודל מאגר ה-GPU מופיע עכשיו בהודעת השגיאה כשיוצרים מאגר GPU גדול מדי. בעיה מס' 374167798

תמיכה ניסיונית בפורמטים של טקסטורות מנורמלות של 16 ביט

פורמטים של טקסטורות רגילות עם סימן ורגילות ללא סימן של 16 ביט זמינים עכשיו באופן ניסיוני, בהתאמה מאחורי התכונות "chromium-experimental-snorm16-texture-formats" ו-"chromium-experimental-unorm16-texture-formats" של המעבדים הגרפיים, בזמן שמתנהל דיון על סטנדרטיזציה שלהם.

התכונות האלה מוסיפות תמיכה בפורמטים של טקסטורות מנורמלות של 16 ביט עם שימושים מסוג COPY_SRC,‏ COPY_DST,‏ TEXTURE_BINDING,‏ RENDER_ATTACHMENT,‏ יכולות של דגימה מרובה ויכולות של פתרון. הפורמטים הנוספים הם "r16unorm",‏ "rg16unorm",‏ "rgba16unorm",‏ "r16snorm",‏ "rg16snorm" ו-"rgba16snorm".

עד שהתכונות הניסיוניות האלה יהיו סטנדרטיות, צריך להפעיל את הדגל 'Unsafe WebGPU Support' בקטע chrome://flags/#enable-unsafe-webgpu כדי שהן יהיו זמינות ב-Chrome.

אפשר לעיין בקטע הקוד הבא ובבעיה 374790898.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

// Send the appropriate commands to the GPU...

עדכונים של Dawn

השיטות EnumerateFeatures(FeatureName * features) מ-wgpu::Adapter ומ-wgpu::Device הוצאו משימוש, ועכשיו צריך להשתמש ב-GetFeatures(SupportedFeatures * features). בעיה מס' 368672123

ב-webgpu.h C API, כל ה-char const * השתנו למבנה WGPUStringView שמגדיר תצוגה של מחרוזת בקידוד UTF-8. הוא פועל כמו פוינטר לנתוני המחרוזת, יחד עם אורך. כך אפשר לעבוד עם חלקים ממחרוץ בלי להעתיק אותו. בעיה מס' 42241188

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

מה חדש ב-WebGPU

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

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