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

فرانسوا بوفور
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 ضروری هستند تا طیف وسیعی از مقادیر رنگ را حفظ کرده و از ایجاد مصنوعات نواری رنگ جلوگیری کنند. به عنوان مثال در مصورسازی علمی.

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

به قطعه کد زیر، ورودی 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...

ویژگی اطلاعات adapterInfo GPUDevice

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

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

به قطعه کد زیر، ورودی 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، یک بافت GPU معتبر برمی‌گرداند، جلوگیری می‌کند. اطلاعات بیشتر را می‌توانید در شماره 372837859 بیابید.

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

استفاده از بافت‌های با فرمت "sint" ، "uint" و " depth" با نمونه‌های فیلترینگ قبلاً مجاز بود. اکنون به درستی استفاده از بافت با فرمت "sint" یا "uint" با نمونه‌گیر فیلترینگ را ممنوع می‌کند. توجه داشته باشید که در حال حاضر اگر از بافت " depth" با نمونه‌گیر فیلترینگ استفاده کنید، هشداری منتشر می‌کند زیرا در آینده مجاز نخواهد بود. به شماره 376497143 مراجعه کنید.

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

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

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

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

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

اندازه بافر 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" .

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

به قطعه کد زیر و شماره ۳۷۴۷۹۰۸۹۸ مراجعه کنید.

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) منسوخ شده‌اند. به شماره ۳۶۸۶۷۲۱۲۳ مراجعه کنید.

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

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

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

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

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳