ویژگی‌های جدید WebGPU (Chrome 128)

François Beaufort
François Beaufort

آزمایش با زیرگروه‌ها

ویژگی زیرگروه‌ها موازی‌سازی سطح SIMD را فعال می‌کند و به رشته‌های درون یک گروه اجازه می‌دهد با هم ارتباط برقرار کنند و عملیات ریاضی جمعی انجام دهند (برای مثال، محاسبه مجموع ۱۶ عدد). این کار شکل بسیار کارآمدی از هم‌رسانی داده بین رشته‌ها را فراهم می‌کند.

پیاده‌سازی حداقلی پیشنهاد زیرگروه‌ها برای آزمایش محلی در پشت پرچم «پشتیبانی ناامن از WebGPU» در chrome://flags/#enable-unsafe-webgpu دردسترس است.

همچنین می‌توانید با ثبت‌نام برای آزمایش مبدأ، زیرگروه‌هایی را در سایتتان با کاربران واقعی امتحان کنید. برای دریافت دستورالعمل‌های مربوط به نحوه آماده‌سازی سایت برای استفاده از آزمایش‌های مبدأ، شروع به کار با آزمایش‌های مبدأ را بخوانید. آزمایش مبدأ از Chrome نسخه ۱۲۸ تا ۱۳۱ (پایان ۱۹ فوریه ۲۰۲۵) اجرا خواهد شد. قصد آزمایش را ببینید.

وقتی ویژگی "subgroups" در GPUAdapter دردسترس قرار گرفت، GPUDevice را با این ویژگی درخواست کنید تا از زیرگروه‌ها در WGSL پشتیبانی کنید و محدودیت‌های minSubgroupSize و maxSubgroupSize آن را بررسی کنید.

همچنین باید این افزونه را به‌طور صریح در کد WGSL خود با enable subgroups; فعال کنید. وقتی فعال شود، به موارد افزودنی زیر دسترسی پیدا می‌کنید:

  • ‫subgroup_invocation_id: مقدار داخلی برای شاخص رشته در زیرگروه.
  • ‫subgroup_size: مقدار داخلی برای دسترسی به اندازه زیرگروه.
  • ‫subgroupBallot(value): مجموعه‌ای از فیلدهای بیت را برمی‌گرداند که در آن بیت مربوط به subgroup_invocation_id اگر value برای آن فراخوانی فعال درست باشد ۱ است و درغیراین‌صورت ۰ است.
  • ‫subgroupBroadcast(value, id): value را از فراخوانی با subgroup_invocation_id مطابقت id به همه فراخوانی‌های درون زیرگروه همه‌فرستی می‌کند. توجه: id باید ثابت زمان ترجمه باشد.

در آینده، توابع داخلی بیشتری مثل subgroupAdd،‏ subgroupAll،‏ subgroupElect،‏ subgroupShuffle اضافه خواهد شد. مسئله ۳۵۴۷۳۸۷۱۵ را ببینید.

برای مجاز کردن f16 در عملیات زیرگروه‌ها، GPUDevice را با ویژگی‌های "subgroups"،‏ "subgroups-f16"، و "shader-f16" درخواست کنید، سپس آن را در کد WGSL خود با enable f16, subgroups, subgroups_f16; فعال کنید.

تکه‌کد زیر پایه‌ای برای دستکاری و کشف پتانسیل زیرگروه‌ها ارائه می‌دهد.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("subgroups")) {
  throw new Error("Subgroups support is not available");
}
// Explicitly request subgroups support.
const device = await adapter.requestDevice({
  requiredFeatures: ["subgroups"],
});

const shaderModule = device.createShaderModule({ code: `
  enable subgroups;

  var<workgroup> wgmem : u32;

  @group(0) @binding(0)
  var<storage, read> inputs : array<u32>;

  @group(0) @binding(1)
  var<storage, read_write> output : array<u32>;

  @compute @workgroup_size(64)
  fn main(@builtin(subgroup_size) subgroupSize : u32,
          @builtin(subgroup_invocation_id) id : u32,
          @builtin(local_invocation_index) lid : u32) {
    // One thread per workgroup writes the value to workgroup memory.
    if (lid == 0) {
      wgmem = inputs[lid];
    }
    workgroupBarrier();
    var v = 0u;

    // One thread per subgroup reads the value from workgroup memory
    // and shares that value with every other thread in the subgroup
    // to reduce local memory bandwidth.
    if (id == 0) {
      v = wgmem;
    }
    v = subgroupBroadcast(v, 0);
    output[lid] = v;
  }`,
});

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

منسوخ کردن تنظیم گرایش عمق برای خطوط و نقاط

تغییر مشخصات WebGPU باعث می‌شود که تنظیم depthBias، depthBiasSlopeScale، و depthBiasClamp روی مقدار غیرصفر وقتی که توپولوژی خط لوله رندر از نوع خط یا نقطه باشد، خطای اعتبارسنجی ایجاد کند. برای اینکه توسعه‌دهندگان زمان کافی برای به‌روزرسانی کد خود داشته باشند، هشداری درباره این اعتبارسنجی آتی در «کنسول DevTools» نشان داده می‌شود و درعین‌حال مقادیر در این شرایط به ۰ تغییر می‌کند. مسئله ۳۵۲۵۶۷۴۲۴ را ببینید.

پنهان کردن هشدار DevTools خطای ثبت‌نشده درصورت preventDefault

در «کنسول DevTools»، اگر شنونده رویدادی برای uncapturederror ثبت شده باشد و روش preventDefault() «رویداد» در برگشت شنونده رویداد فراخوانی شده باشد، هشدارهای مربوط به رویدادهای uncapturederror دیگر نمایش داده نمی‌شود. این رفتار با مدیریت رویداد در جاوا اسکریپت مطابقت دارد. به مثال زیر و مسئله ۴۰۲۶۳۶۱۹ مراجعه کنید.

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

device.addEventListener("uncapturederror", (event) => {
  // Prevents browser warning to show up in the DevTools Console.
  event.preventDefault();

  // TODO: Handle event.error
});

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

ویژگی WGSL interpolate به شما امکان می‌دهد درونیابی داده‌های ورودی/خروجی تعریف‌شده توسط کاربر را مدیریت کنید. اکنون، پارامترهای نمونه‌گیری درونیابی جدید first (پیش‌فرض) و either کنترل بیشتری به شما می‌دهند: first از مقدار اولین رأس عنصر اولیه استفاده می‌کند، درحالی‌که either به شما امکان می‌دهد از اولین یا آخرین رأس استفاده کنید. مشکل ۳۴۰۲۷۸۴۴۷ را ببینید.

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

پیاده‌سازی Dawn's WGPUFuture برای مدیریت عملیات ناهم‌زمان اکنون کامل شده است. مفاهیم کلیدی شامل wgpuInstanceProcessEvents برای پردازش رویداد فرصت‌طلبانه و WGPUCallbackMode برای تعریف مکان‌های برگشت‌پذیر است. ‫WGPUFuture نشان‌دهنده رویدادهای یک‌باره با طول عمر نامحدود است و wgpuInstanceWaitAny منتظر تکمیل هر رویداد آینده یا زمان اتمام است. مشکل ۴۲۲۴۰۹۳۲ را ببینید.

مقدار CompositeAlphaMode::Auto اکنون توسط Surface::GetCapabilities() گزارش نمی‌شود. هنوز معتبر است و معادل Surface::GetCapabilities().alphaMode[0] است. مسئله ۲۹۲ را ببینید.

پس‌زمینه OpenGL اکنون از Surface با یک انتقال y-flip برای هر فراخوانی Present() پشتیبانی می‌کند. مشکل ۳۴۴۸۱۴۰۸۳ را ببینید.

روش Adapter::GetProperties() منسوخ شده است و به‌جای آن باید از Adapter::GetInfo() استفاده کنید.

جاسوانت، همیار خارجی، همه فایل‌های CMake را بازنویسی کرده است و به‌روزرسانی آن‌ها را آسان‌تر کرده است و امکان پیش‌ساخت را فراهم کرده است. راهنمای شروع سریع را برای استفاده از Dawn در پروژه‌های CMake بررسی کنید.

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

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

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

‫۱۵۵-۱۵۶ Chrome

‫۱۵۳-۱۵۴ Chrome

Chrome 151-152

‫۱۴۹-۱۵۰ Chrome

‫۱۴۷-۱۴۸ Chrome

‫۱۴۶ Chrome

‫Chrome 145

‫۱۴۴ Chrome

‫۱۴۳ Chrome

‫۱۴۲ Chrome

Chrome 141

‫۱۴۰ Chrome

Chrome 139

‫Chrome 138

Chrome 137

‫Chrome 136

‫۱۳۵ Chrome

‫۱۳۴ Chrome

‫Chrome 133

‫۱۳۲ Chrome

‫۱۳۱ Chrome

‫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