מה חדש ב-WebGPU (Chrome124)

François Beaufort
François Beaufort

טקסטורות אחסון לקריאה בלבד ולקריאה וכתיבה

סוג הקישור של טקסטורת האחסון מאפשר לתוכנות הצללה לקרוא ממרקמים של אחסון מבלי להוסיף את השימוש ב-TEXTURE_BINDING, ולבצע קריאה וכתיבה מעורבים בפורמטים מסוימים. כשתוסף השפה של WGSL "readonly_and_readwrite_storage_textures" מופיע ב-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 מעלה את התמיכה של עובדי האינטרנט לרמה הבאה, שמציעה עכשיו תמיכה גם לעובדי שירות וגם לעובדים משותפים. אפשר להשתמש בקובצי שירות (service workers) כדי לשפר את המשימות ברקע ואת היכולות אופליין, ובעובדים משותפים (shared workers) כדי לשתף משאבים בצורה יעילה בין סקריפטים. ראו בעיה chromium:41494731.

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

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

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

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

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

תיקוני באגים

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

עדכונים של Dawn

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

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

מה חדש ב-WebGPU

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

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