ویژگی‌های جدید WebGPU (کروم ۱۵۳-۱۵۴)

فرانسوا بوفور
François Beaufort

منتشر شده: ۱۵ سپتامبر ۲۰۲۶

افزونه‌ی buffer_view در WGSL

افزونه‌ی زبان WGSL buffer_view امکان می‌دهد داده‌های یک متغیر uniform، storage یا workgroup به صورت چندین نوع مختلف تفسیر شوند. این قابلیت کاربردهای گسترده‌ای از کاربردهای معمول تایپ جناس‌سازی گرفته تا تقسیم‌بندی یک متغیر به چندین متغیر منطقی دارد.

برای ایمنی و سادگی پیاده‌سازی، انواع تفسیر شده فقط با استفاده از توابع داخلی زیر قابل دسترسی هستند:

  • bufferView<T>() حافظه را در یک بایت آفست خاص به عنوان یک اشاره‌گر به نوع T تفسیر می‌کند.
  • bufferArrayView<T>() یک اشاره‌گر آرایه محدود با تعداد عناصر صریح ایجاد می‌کند.
  • bufferLength() اندازه بایت بافر را برمی‌گرداند.

این افزونه زبان می‌تواند با استفاده از navigator.gpu.wgslLanguageFeatures در جاوا اسکریپت شناسایی شود. توصیه می‌شود از یک دستورالعمل require-برای نشان دادن احتمال عدم قابلیت حمل با requires buffer_view ; در بالای کد سایه‌زن WGSL خود استفاده کنید. به مثال WGSL زیر و هدف ship مراجعه کنید.

requires buffer_view;

//  +-------------------+-----------------------------+----------------------------+
//  | Byte 0 .. 3       | Byte 4 .. (4 + N - 1)       | Byte (4 + N) .. End        |
//  +-------------------+-----------------------------+----------------------------+
//  | indices_size (u32)| indices (array<u32, count>) | vertices (array<f32>)      |
//  +-------------------+-----------------------------+----------------------------+
@group(0) @binding(0) var<storage> indices_and_vertices : buffer;

fn unpack_and_process_geometry() {
  let indices_size = *bufferView<u32>(&indices_and_vertices, 0);

  let indices = bufferArrayView<array<u32>>(&indices_and_vertices, 4, indices_size);
  let vertices = bufferView<array<f32>>(&indices_and_vertices, indices_size + 4);
  ...
}

همچنین می‌توانید برای جزئیات بیشتر ، طرح پیشنهادی buffer view را بررسی کنید و با نمونه Wireframe WebGPU کار کنید.

افزونه‌ی swizzle_assignment در WGSL

در پاسخ به یکی از ویژگی‌های بسیار مورد درخواست جامعه، افزونه WGSL swizzle_assignment به شما امکان می‌دهد مستقیماً در swizzles برداری بنویسید و چندین کامپوننت را در یک دستور واحد به‌روزرسانی کنید. این افزونه به طور چشمگیری کدهای تکراری را کاهش می‌دهد و خوانایی سایه‌زن را بهبود می‌بخشد و در عین حال WGSL را با سایر زبان‌های سایه‌زن هماهنگ می‌کند.

این افزونه زبان می‌تواند با استفاده از navigator.gpu.wgslLanguageFeatures در جاوا اسکریپت شناسایی شود. توصیه می‌شود از یک دستورالعمل require-برای نشان دادن احتمال عدم قابلیت حمل با requires swizzle_assignment ; در بالای کد سایه‌زن WGSL خود استفاده کنید. به مثال WGSL زیر و هدف ship مراجعه کنید.

if (!navigator.gpu.wgslLanguageFeatures.has("swizzle_assignment")) {
  throw new Error(`WGSL swizzle assignment is not available`);
}

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

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

  @vertex
  fn main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4f {
    var position = vec4f(0.0, 0.0, 0.0, 1.0);
    position.xy = vec2f(10.0, 20.0); // Swizzle assignment

    return position;
  }`,
});

به‌روزرسانی‌های افزونه WGSL

افزونه‌ی زبان texture-formats-tier1 ، اگرچه در کد WGSL پشتیبانی می‌شود، اما قبلاً به درستی در جاوا اسکریپت به navigator.gpu.wgslLanguageFeatures (به صورت texture_formats_tier1 ) نگاشت نمی‌شد. این مشکل نگاشت اکنون برطرف شده است. به Chromium CL 8159562 مراجعه کنید.

افزونه‌ی زبان subgroups اکنون به‌طور خودکار هنگام فعال بودن subgroup_size_control در WGSL فعال می‌شود. به شماره‌ی dawn:545285663 مراجعه کنید.

به‌روزرسانی‌های سپیده‌دم

ویژگی آزمایشی جدید wgpu::FeatureName::BufferMapWriteExtendedUsages به شما امکان می‌دهد با ترکیب wgpu::BufferUsage::MapWrite با هر wgpu::BufferUsage دیگر، به جز wgpu::BufferUsage::MapRead ، یک بافر ایجاد کنید تا مستقیماً در یک بافر قابل نگاشت که قابل استفاده توسط GPU نیز هست، بنویسید و بافر مرحله‌بندی و کپی اضافی روی بک‌اندهای Vulkan و D3D12 را حذف کنید. برای اطلاعات بیشتر، به Buffer Map Write Extended Usages و شماره dawn:386255678 مراجعه کنید.

اکنون می‌توانید با استفاده از webgpu_upstream_cpp_headers جدید، به جای وابستگی به نسخه Dawn، از اتصالات webgpu_cpp.h روی هر پیاده‌سازی webgpu.h استفاده کنید. به webgpu-headers issue #596 مراجعه کنید.

داون اکنون به macOS 13.0 یا بالاتر نیاز دارد. به Dawn CL 334415 مراجعه کنید.

این فقط برخی از نکات برجسته کلیدی را پوشش می‌دهد. برای جزئیات بیشتر ، لیست جامع کامیت‌ها را بررسی کنید.

ویژگی‌های جدید WebGPU

فهرستی از تمام مواردی که در مجموعه «ویژگی‌های جدید WebGPU» پوشش داده شده است.

کروم ۱۵۳-۱۵۴

کروم ۱۵۱-۱۵۲

کروم ۱۴۹-۱۵۰

کروم ۱۴۷-۱۴۸

کروم ۱۴۶

کروم ۱۴۵

کروم ۱۴۴

کروم ۱۴۳

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳