מה חדש ב-WebGPU (Chrome124)

François Beaufort
François Beaufort

סוג הקישור של טקסטורות האחסון מאפשר לשיחות לקרוא מטקסטורות האחסון בלי להוסיף את השימוש ב-TEXTURE_BINDING, ולבצע פעולות קריאה וכתיבה מעורבות בפורמטים מסוימים. כשתוסף השפה "readonly_and_readwrite_storage_textures" של WGSL נמצא ב-navigator.gpu.wgslLanguageFeatures, עכשיו אפשר להגדיר את הגישה של GPUStorageTexture ל-"read-write" או ל-"read-only" כשיוצרים פריסה של קבוצת קישור. בעבר, המגבלה הייתה "write-only".

לאחר מכן, קוד ה-WGSL של ה-shader יכול להשתמש במאפיין הגישה read_write ו-read למרקמים של אחסון, הפונקציות המובנות textureLoad() ו-textureStore() פועלות בהתאם, ופונקציה מובנית חדשה textureBarrier() זמינה לסנכרון של גישות לזיכרון של מרקמים בקבוצת עבודה.

מומלץ להשתמש בהנחיה של requires כדי לסמן את האפשרות של אי-ניידות באמצעות requires readonly_and_readwrite_storage_textures; בחלק העליון של קוד ה-WGSL של ה-shader. ראו את הדוגמה הבאה וגם את הבעיה dawn:1972.

if (!navigator.gpu.wgslLanguageFeatures.has("readonly_and_readwrite_storage_textures")) {
  throw new Error("Read-only and read-write storage textures are not available");
}

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

const bindGroupLayout = device.createBindGroupLayout({
  entries: [{
    binding: 0,
    visibility: GPUShaderStage.COMPUTE,
    storageTexture: {
      access: "read-write", // <-- New!
      format: "r32uint",
    },
  }],
});

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

  @group(0) @binding(0) var tex : texture_storage_2d<r32uint, read_write>;

  @compute @workgroup_size(1, 1)
  fn main(@builtin(local_invocation_id) local_id: vec3u) {
    var data = textureLoad(tex, vec2i(local_id.xy));
    data.x *= 2;
    textureStore(tex, vec2i(local_id.xy), data);
  }`
});

// You can now create a compute pipeline with this shader module and
// send the appropriate commands to the GPU.

תמיכה בקובצי שירות (service worker) ובעובדים משותפים

WebGPU ב-Chrome מעלה את רמת התמיכה ב-Web Workers לשלב הבא, ומציע עכשיו תמיכה גם ב-service workers וגם ב-shared workers. אפשר להשתמש בקובצי שירות (service workers) כדי לשפר את המשימות ברקע ואת היכולות אופליין, ובכוח עבודה משותף (shared workers) כדי לשתף משאבים ביעילות בין סקריפטים. בעיה chromium:41494731

כדאי לעיין בתוסף לדוגמה ל-Chrome ובתוסף WebLLM ל-Chrome כדי לראות איך משתמשים ב-WebGPU ב-service worker של תוסף.

צילום מסך של תוסף WebLLM ל-Chrome.
התוסף WebLLM ל-Chrome

מאפיינים חדשים של פרטי המתאם

מאפייני המידע הלא סטנדרטיים של המתאם d3dShaderModel ו-vkDriverVersion זמינים עכשיו בקריאה ל-requestAdapterInfo() אם המשתמש הפעיל את הדגל 'WebGPU Developer Features' ב-chrome://flags/#enable-webgpu-developer-features. מתי התכונה נתמכת:

צילום מסך של https://webgpureport.org עם vkDriverVersion בפרטי המתאם.
פרטי המתאם vkDriverVersion מוצגים בכתובת https://webgpureport.org.

תיקוני באגים

יצירת שני צינורות עיבוד נתונים עם קבוצות קישור תואמות באמצעות layout: "auto", ואז יצירת קבוצת קישור עם צינור עיבוד הנתונים הראשון ושימוש בה בצינור עיבוד הנתונים השני, גורמת עכשיו להודעת השגיאה GPUValidationError. ההרשאה הזו הייתה באג בהטמעה, ותוקנה עכשיו באמצעות בדיקות מתאימות. ראו issue dawn:2402.

עדכונים של Dawn

ב-Dawn API, פונקציית ה-callback של השגיאה שלא תועדה שהוגדרה באמצעות wgpuDeviceSetUncapturedErrorCallback לא נקראת יותר אחרי אובדן מכשיר ה-GPU. התיקון הזה תואם את Dawn למפרט של JavaScript API ולהטמעה של Blink. בעיה dawn:2459

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

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