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

François Beaufort
François Beaufort

منتشرشده: ۸ ژانویه ۲۰۲۵

استفاده از نمای بافت

نمای بافت GPU درحال‌حاضر همه پرچم‌های استفاده را از بافت GPU منبع خود به‌ارث می‌برد. این می‌تواند مشکل‌ساز باشد زیرا برخی‌از قالب‌های نمایشی با برخی‌از کاربردها ناسازگار هستند. برای رفع این مشکل، فراخوانی createView() با عضو اختیاری usage به شما امکان می‌دهد زیرمجموعه‌ای از پرچم‌های استفاده بافت منبع را که با قالب نمای انتخابی سازگار است به‌طور صریح مشخص کنید.

این تغییر امکان اعتبارسنجی پیشاپیش و کنترل دقیق‌تر بر نحوه استفاده از نما را فراهم می‌کند. این ویژگی همچنین با دیگر APIهای گرافیکی که در آن‌ها پرچم‌های استفاده پارامترهای رایج در ایجاد نما هستند هم‌راستا است و فرصت‌های بهینه‌سازی را ارائه می‌دهد.

تکه‌کد زیر، ورودی chromestatus، و مسئله ۳۶۳۹۰۳۵۲۶ را ببینید.

const texture = myDevice.createTexture({
  size: [4, 4],
  format: "rgba8unorm",
  usage:
    GPUTextureUsage.RENDER_ATTACHMENT |
    GPUTextureUsage.TEXTURE_BINDING |
    GPUTextureUsage.STORAGE_BINDING,
  viewFormats: ["rgba8unorm-srgb"],
});

const view = texture.createView({
  format: 'rgba8unorm-srgb',
  usage: GPUTextureUsage.RENDER_ATTACHMENT, // Restrict allowed usage.
});

ترکیب بافت‌های شناور ۳۲ بیتی

بافت‌های شناور ۳۲ بیتی برای رندرینگ HDR ضروری هستند تا طیف گسترده‌ای از مقادیر رنگ را حفظ کنند و از آرتیفکت‌های باندینگ رنگ جلوگیری کنند. برای مثال در تجسم علمی.

ویژگی جدید "float32-blendable" GPU باعث می‌شود بافت‌های GPU با قالب‌های "r32float"،‏ "rg32float"، و "rgba32float" ترکیب‌پذیر شوند. اکنون هنگام درخواست دستگاه GPU با این ویژگی، ایجاد خط لوله پردازشی که از ترکیب با هر پیوست قالب float32 استفاده می‌کند امکان‌پذیر است.

به گزیده زیر، ورودی chromestatus، و مشکل ۳۶۹۶۴۹۳۴۸ مراجعه کنید.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("float32-blendable")) {
  throw new Error("32-bit float textures blending support is not available");
}
// Explicitly request 32-bit float textures blending support.
const device = await adapter.requestDevice({
  requiredFeatures: ["float32-blendable"],
});

// ... Creation of shader modules is omitted for readability.

// Create a render pipeline that uses blending for the rgba32float format.
device.createRenderPipeline({
  vertex: { module: myVertexShaderModule },
  fragment: {
    module: myFragmentShaderModule,
    targets: [
      {
        format: "rgba32float",
        blend: { color: {}, alpha: {} },
      },
    ],
  },
  layout: "auto",
});

// Create the GPU texture with rgba32float format and
// send the appropriate commands to the GPU...

مشخصه GPUDevice adapterInfo

برای کتابخانه‌هایی که از اشیای ارائه‌شده توسط کاربر GPUDevice استفاده می‌کنند، دسترسی به اطلاعات مربوط به GPU فیزیکی مهم است، زیرا ممکن است لازم باشد براساس معماری GPU بهینه‌سازی کنند یا راهکارهای جانبی پیاده‌سازی کنند. اگرچه ازطریق شیء GPUAdapter می‌توان به این اطلاعات دسترسی داشت، اما راه مستقیمی برای دریافت آن از GPUDevice به‌تنهایی وجود ندارد. این کار می‌تواند دردسرساز باشد، زیرا ممکن است کاربران را ملزم کند که همراه با GPUDevice اطلاعات بیشتری ارائه دهند.

برای رسیدگی به این مشکل، GPUAdapterInfo اکنون ازطریق مشخصه GPUDevice adapterInfo نمایان شده است. این‌ها مشابه مشخصه GPUAdapter info موجود است.

تکه‌کد زیر، ورودی chromestatus، و مشکل ۳۷۶۶۰۰۸۳۸ را ببینید.

function optimizeForGpuDevice(device) {
  if (device.adapterInfo.vendor === "amd") {
    // Use AMD-specific optimizations.
  } else if (device.adapterInfo.architecture.includes("turing")) {
    // Optimize for NVIDIA Turing architecture.
  }
}

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

قبلاً، استفاده از قالب بافت نامعتبر با روش configure() زمینه بوم GPU منجر به خطای اعتبارسنجی GPU می‌شد. این به پرتاب کردن TypeError جاوا اسکریپت تغییر کرده است. این کار از سناریوهایی که در آن‌ها getCurrentTexture() با وجود پیکربندی نادرست بافت GPU برمی‌گرداند جلوگیری می‌کند. اطلاعات بیشتر را می‌توانید در مسئله ۳۷۲۸۳۷۸۵۹ پیدا کنید.

محدودیت‌های نمونه‌برداری فیلتر کردن بافت‌ها

قبلاً استفاده از "sint"، "uint"، و «بافت‌های قالب depth" با نمونه‌های فیلترشده» مجاز بود. اکنون به‌درستی استفاده از بافت قالب "sint" یا "uint" را با نمونه‌برداری فیلتر کردن غیرمجاز می‌کند. توجه داشته باشید که درحال‌حاضر اگر از «depth" بافت با نمونه‌بردار فیلتردار» استفاده کنید، هشداری صادر می‌کند زیرا در آینده مجاز نخواهد بود. مشکل ۳۷۶۴۹۷۱۴۳ را ببینید.

این محدودیت‌ها به این معنی است که استفاده از بافت عمق با نمونه‌بر غیرفیلتر نیازمند ایجاد دستی چیدمان‌های گروه پیوند است. دلیل این است که چیدمان‌های گروه پیوند تولیدشده «خودکار» هنوز از این ترکیب پشتیبانی نمی‌کنند. مشکل مشخصات ۴۹۵۲ حاوی پیشنهادی است که در دست بررسی است تا این محدودیت در آینده برطرف شود.

آزمایش زیرگروه‌های گسترده

آزمایش زیرگروه‌ها که در ابتدا قرار بود در Chrome 131 پایان یابد، تا Chrome 133 تمدید شده است و در ۱۶ آوریل ۲۰۲۵ به پایان می‌رسد. درحالی‌که اولین آزمایش معرفی ویژگی جدید بر عملکرد تمرکز داشت، فاقد پادمان‌های حیاتی قابلیت حمل بود. این پادمان‌ها اکنون اضافه خواهد شد و احتمالاً باعث بروز خطا در کد موجود خواهد شد.

بهبود تجربه توسعه‌دهنده

اکنون وقتی از گزینه powerPreference با requestAdapter() در Windows استفاده می‌شود، هشداری در DevTools نمایان می‌شود. وقتی Chrome بداند چگونه از دو GPU مختلف استفاده کند و نتایج را بین آن‌ها ترکیب کند، این هشدار برداشته خواهد شد. مشکل ۳۶۹۲۱۹۱۲۷ را ببینید.

اکنون اندازه بافر GPU هنگام ایجاد بافر GPU بسیار بزرگ در پیام خطا نشان داده می‌شود. مشکل ۳۷۴۱۶۷۷۹۸ را ببینید.

پشتیبانی آزمایشی از قالب‌های بافت نرمال‌سازی‌شده ۱۶ بیتی

قالب‌های بافت نرمال‌سازی‌شده امضادار ۱۶ بیتی و نرمال‌سازی‌شده بدون امضا اکنون به‌صورت آزمایشی به‌ترتیب در پشت ویژگی‌های GPU "chromium-experimental-snorm16-texture-formats" و "chromium-experimental-unorm16-texture-formats" دردسترس هستند و درحال بحث و بررسی برای استانداردسازی هستند.

این ویژگی‌ها از قالب‌های بافت نرمال‌سازی‌شده ۱۶ بیتی با COPY_SRC، COPY_DST، TEXTURE_BINDING، RENDER_ATTACHMENT کاربرد، قابلیت‌های نمونه‌برداری چندگانه، و قابلیت‌های حل‌وفصل پشتیبانی می‌کنند. قالب‌های اضافی عبارت‌اند از "r16unorm"، "rg16unorm"، "rgba16unorm"، "r16snorm"، "rg16snorm"، و "rgba16snorm".

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

تکه زیر و مشکل ۳۷۴۷۹۰۸۹۸ را ببینید.

const adapter = await navigator.gpu.requestAdapter();
if (!adapter.features.has("chromium-experimental-snorm16-texture-formats")) {
  throw new Error("16-bit signed normalized formats support is not available");
}
// Explicitly request 16-bit signed normalized formats support.
const device = await adapter.requestDevice({
  requiredFeatures: ["chromium-experimental-snorm16-texture-formats"],
});

// Create a texture with the rgba16snorm format which consists of four
// components, each of which is a 16-bit, normalized, signed integer value.
const texture = device.createTexture({
  size: [4, 4],
  format: "rgba16snorm",
  usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING,
});

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

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

روش‌های EnumerateFeatures(FeatureName * features) از wgpu::Adapter و wgpu::Device منسوخ شده‌اند و به‌جای آن‌ها از GetFeatures(SupportedFeatures * features) استفاده می‌شود. به مسئله ۳۶۸۶۷۲۱۲۳ مراجعه کنید.

میانای برنامه‌سازی کاربردی C در webgpu.h همه char const * را به ساختار WGPUStringView تغییر داده است که نمایی از رشته کدبندی‌شده UTF-8 را تعریف می‌کند. این متغیر مثل اشاره‌گری به داده‌های رشته عمل می‌کند و با طول آن جفت می‌شود. این کار به شما امکان می‌دهد بدون نیاز به کپی کردن رشته، با بخش‌هایی از آن کار کنید. مشکل ۴۲۲۴۱۱۸۸ را ببینید.

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

ویژگی‌های جدید 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