מה חדש ב-WebGPU (Chrome {8/}118)

François Beaufort
François Beaufort

תמיכה ב-HTMLImageElement וב-ImageData ב-CopyExternalImageToTexture()

השיטה copyExternalImageToTexture() ב-GPUQueue מאפשרת להעתיק תמונת מצב שנלקחה מתמונה, מסרטון או מקנבס מקור אל GPUTexture נתון. עכשיו אפשר להעביר אובייקטים מסוג HTMLImageElement ו-ImageData בתור המקור. ראו את הדוגמה הבאה ואת הבעיה chromium:1471372.

// Fetch and decode image.
const source = document.createElement("img");
source.src = "my-image.png";
await source.decode();

// Create destination texture.
const size = [source.width, source.height];
const texture = myDevice.createTexture({
 size,
 format: "rgba8unorm",
 usage:
   GPUTextureUsage.COPY_DST |
   GPUTextureUsage.RENDER_ATTACHMENT |
   GPUTextureUsage.TEXTURE_BINDING,
});

// Copies a snapshot taken from the source image into a texture.
myDevice.queue.copyExternalImageToTexture({ source }, { texture }, size);

תמיכה ניסיונית במרקם האחסון לקריאה בלבד ולקריאה בלבד

סוג הקישור של טקסטורת האחסון מאפשר לבצע קריאות של טקסטורות ללא דגימה ולאחסן במיקומים שרירותיים בכלי הצללה. כשהתכונה "chromium-experimental-read-write-storage-texture" זמינה ב-GPUAdapter, אפשר עכשיו לבקש GPUDevice עם התכונה הזו ולהגדיר גישת GPUStorageTexture ל-"read-write" או ל-"read-only" בזמן יצירת פריסה של קבוצת קישור. בעבר האפשרות הזו הוגבלה ל-"write-only".

כדי ליהנות מהיתרונות האלה, צריך להפעיל את התוסף הזה באופן מפורש בקוד WGSL עם enable chromium_experimental_read_write_storage_texture. כשהאפשרות מופעלת, אפשר להשתמש בתוחם הגישה read_write ו-read למרקמים של אחסון, הפונקציות המובנות textureLoad() ו-textureStore() פועלות בהתאם, ויש פונקציה מובנית חדשה textureBarrier() שזמינה לסנכרון הגישה לזיכרון הטקסטורות בקבוצת עבודה. אפשר לראות את הדוגמה הבאה ואת הבעיה dawn:1972.

התכונה הזו עדיין ניסיונית ועשויה להשתנות. בעוד שהסטנדרטי נהיה סטנדרטי, הפעילו את Chrome עם הדגל --enable-dawn-features=allow_unsafe_apis כדי שהוא יהיה זמין.

const feature = "chromium-experimental-read-write-storage-texture";
const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has(feature)) {
  throw new Error("Read-write storage texture support is not available");
}
// Explicitly request read-write storage texture support.
const device = await adapter.requestDevice({
  requiredFeatures: [feature],
});

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

const shaderModule = device.createShaderModule({ code: `
  enable chromium_experimental_read_write_storage_texture;
  @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.

עדכונים לגבי זריחה

ה-webgpu.h C API שינה את השם של השדות הבאים לצורך עקביות: requiredFeaturesCount ל-requiredFeatureCount, pipelineStatisticsCount ל-pipelineStatisticCount ו-colorFormatsCount ל-colorFormatCount. ראו גיליון dawn:146040.

תוכנת DawnInfo חדשה (בדומה ל-vulkaninfo) מאפשרת להציג רשימה של מתגים, מתאמים, תכונות מתאמים ומגבלות מתאמים. היא זמינה במהלך בניית השחר ב-samples. כאן מוצג הפלט, בגרסה עם חיתוך חשוב במיוחד כדי לקצר את משך הזמן. ראו שינוי השחר:149020.

./out/Debug/DawnInfo
Toggles
=======
  Name: allow_unsafe_apis
    Suppresses validation errors on API entry points or parameter combinations
    that aren't considered secure yet.
    http://crbug.com/1138528
[…]

Adapter
=======
VendorID: 0x106B
Vendor: apple
Architecture: common-3
DeviceID: 0x0000
Name: Apple M1 Pro
Driver description: Metal driver on macOS Version 13.5.1 (Build 22G90)
Adapter Type: discrete GPU
Backend Type: Metal
Power: <undefined>

  Features
  ========
   * depth_clip_control
      Disable depth clipping of primitives to the clip volume
      https://bugs.chromium.org/p/dawn/issues/detail?id=1178
[…]

  Adapter Limits
  ==============
    maxTextureDimension1D: 16,384
    maxTextureDimension2D: 16,384
[…]

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

מה חדש ב-WebGPU

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

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