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

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

منتشر شده: ۱۷ ژوئن ۲۰۲۶

فوری‌ها

مقادیر بی‌واسطه، که به عنوان ثابت‌های push یا ثابت‌های root نیز شناخته می‌شوند، به شما امکان می‌دهند مقادیر کمی از داده‌هایی که مرتباً در حال تغییر هستند را مستقیماً به shaderها منتقل کنید. این فرآیند، سربار ایجاد بافرهای GPU و مدیریت گروه‌های bind را دور می‌زند.

به‌روزرسانی اتصالات بافر یکنواخت برای داده‌هایی که هر فراخوانی ترسیم را تغییر می‌دهند - مانند شناسه منحصر به فرد شیء یا ماتریس تبدیل سه‌بعدی برای صدها شیء - سربار CPU ایجاد می‌کند. مقادیر خام را مستقیماً به رمزگذار عبوری تزریق کنید تا از نوشتن داده‌ها در حافظه و مدیریت جستجوهای GPU جلوگیری شود.

داده‌های بی‌واسطه، مسیری سریع برای متغیرهای کوچک و بسیار پویا فراهم می‌کنند. برای آرایه‌های بزرگ داده‌ها، ساختارهای پیچیده نورپردازی یا ماتریس‌های عظیم، از بافرهای یکنواخت یا بافرهای ذخیره‌سازی استفاده کنید.

در سایه‌زن WGSL شما، فضای آدرس <immediate> به شما امکان می‌دهد داده‌های فوری را تعریف کنید که می‌توانند مستقیماً به رمزگذار عبور منتقل شوند. در جاوا اسکریپت قبل از فراخوانی draw، تابع setImmediates() را فراخوانی کنید تا این داده‌ها را بدون اتصال به یک گروه ارائه دهید. برای بررسی پشتیبانی، افزونه زبان WGSL با نام immediate_address_space را از طریق navigator.gpu.wgslLanguageFeatures شناسایی کنید. به مثال زیر و هدف ship مراجعه کنید.

if (!navigator.gpu.wgslLanguageFeatures.has('immediate_address_space')) {
   throw new Error(`WGSL immediate address space is not available`);
}

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

const module = device.createShaderModule({ code: `
  requires immediate_address_space;

  var<immediate> color: vec4f;

  @vertex fn vertexMain(@builtin(vertex_index) i : u32) -> @builtin(position) vec4f {
    const pos = array(vec2f(0, 1), vec2f(-1, -1), vec2f(1, -1));
    return vec4f(pos[i], 0, 1);
  }

  @fragment fn fragmentMain() -> @location(0) vec4f {
    return color;
  }`,
});

// Create render pass encoder (omitted)...

// By using layout: 'auto', WebGPU will automatically infer the `immediateSize`
// required by the pipeline layout from the WGSL module.
const pipeline = device.createRenderPipeline({
  layout: 'auto',
  vertex: { module },
  fragment: { module, targets: [{ format }] },
});
myRenderPassEncoder.setPipeline(pipeline);

// Send immediate data to the GPU, then issue a draw call
myRenderPassEncoder.setImmediates(/*rangeOffset=*/0, new Float32Array([255, 0, 0, 255]));
myRenderPassEncoder.draw(3);
myRenderPassEncoder.end();

برای بررسی عمیق‌تر این ویژگی، نگاهی به WebGPUFundamentals Immediates بیندازید.

آفرین به تیم مایکروسافت بابت مشارکتشان!

اعتبارسنجی سختگیرانه‌تر برای پیوست‌های گذرا

WebGPU اخیراً پرچم TRANSIENT_ATTACHMENT GPUTextureUsage را معرفی کرده است که به توسعه‌دهندگان اجازه می‌دهد ضمیمه‌های رندر موقت، مانند بافرهای الگوی عمقی یا اهداف چند نمونه‌ای، ایجاد کنند. این ضمیمه‌ها بدون اختصاص VRAM اصلی، در حافظه کاشی سریع روی تراشه باقی می‌مانند.

به‌روزرسانی‌های اخیر ( #۶۲۴۸ و #۶۲۶۷ ) قوانین اعتبارسنجی را اصلاح می‌کنند تا از سوءاستفاده از این پیوست‌های بافتِ کم‌مصرف جلوگیری شود:

  • با توجه به محدودیت‌های پلتفرم، viewFormats هنگام ایجاد بافت‌های گذرا باید یک آرایه خالی باشد. قالب‌های نمای جایگزین مورد نیاز نیستند زیرا بافت‌های گذرا فقط برای رندر کردن هستند.
  • ایجاد یک نمای بافت، پرچم‌های استفاده را محدود نمی‌کند. هنگام فراخوانی createView() روی یک بافت گذرا، نما نمی‌تواند کاربرد آن را تغییر دهد.
  • پیوست‌های گذرا را نمی‌توان به عنوان resolveTarget درون یک رندر پس (render pass) استفاده کرد.

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

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

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

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

کروم ۱۴۹-۱۵۰

کروم ۱۴۷-۱۴۸

کروم ۱۴۶

کروم ۱۴۵

کروم ۱۴۴

کروم ۱۴۳

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳