موارد جدید در WebGPU (Chrome 128)

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

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

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

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

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

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

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

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

توابع داخلی بیشتری مانند subgroupAdd ، subgroupAll ، subgroupElect ، subgroupShuffle در آینده اضافه خواهند شد. به شماره 354738715 مراجعه کنید.

برای فعال کردن 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 در مورد این اعتبارسنجی قریب‌الوقوع نشان داده می‌شود و در این شرایط مقادیر را نیز به 0 تغییر می‌دهد. به شماره 352567424 مراجعه کنید.

اگر preventDefault خطای ضبط نشده را پنهان کنید، هشدار DevTools

در کنسول DevTools، اگر یک شنونده رویداد برای uncapturederror ثبت شده باشد و متد Event 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 و یا

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

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

پیاده‌سازی WGPUFuture متعلق به Dawn برای مدیریت عملیات ناهمزمان اکنون کامل شده است. مفاهیم کلیدی شامل wgpuInstanceProcessEvents برای پردازش رویدادهای فرصت‌طلبانه و WGPUCallbackMode برای تعریف مکان‌های فراخوانی مجدد است. WGPUFuture رویدادهای یک‌باره با طول عمر نامحدود را مشخص می‌کند و wgpuInstanceWaitAny منتظر تکمیل هرگونه رویداد آینده یا یک مهلت زمانی است. به شماره 42240932 مراجعه کنید.

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

بخش پشتی OpenGL اکنون از Surface با یک نقطه عطف y-flip برای هر فراخوانی Present() پشتیبانی می‌کند. به شماره 344814083 مراجعه کنید.

متد Adapter::GetProperties() به نفع استفاده از Adapter::GetInfo() منسوخ شده است.

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

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

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

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

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳