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

François Beaufort
François Beaufort

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

قالب‌های رأس اضافی unorm8x4-bgra و ۱-جزء

قالب رأس "unorm8x4-bgra" و قالب‌های رأس ۱-مؤلفه‌ای زیر اضافه شده است: "uint8"،‏ "sint8"،‏ "unorm8"،‏ "snorm8"،‏ "uint16"،‏ "sint16"،‏ "unorm16"،‏ "snorm16"، و "float16". قالب رأس "unorm8x4-bgra" بار کردن رنگ‌های رأس کدبندی‌شده BGRA را کمی آسان‌تر می‌کند و درعین‌حال سایه‌زن را حفظ می‌کند. علاوه‌براین، قالب رأس ۱-جزء به شما امکان می‌دهد فقط داده‌های ضروری را درخواست کنید، درحالی‌که قبلاً برای انواع داده ۸ و ۱۶ بیتی حداقل دوبرابر این مقدار لازم بود. ورودی chromestatus و مشکل ۳۷۶۹۲۴۴۰۷ را ببینید.

اجازه دهید محدودیت‌های ناشناس با مقدار تعریف‌نشده درخواست شوند

برای اینکه «میانای برنامه‌سازی کاربردی WebGPU» با تکامل یافتن کمتر شکننده شود، اکنون می‌توانید هنگام درخواست دستگاه GPU، محدودیت‌های ناشناخته را با مقدار undefined درخواست کنید. این کار در کد برنامه زیر مفید است، برای مثال، در جایی که اگر someLimit دیگر وجود نداشته باشد، adapter.limits.someLimit می‌تواند undefined باشد. مشخصات درخواست ادغام ۴۷۸۱ را ببینید.

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

const device = await adapter.requestDevice({
  requiredLimits: { someLimit: adapter.limits.someLimit }, // someLimit can be undefined
});

تغییرات قوانین تراز WGSL

دیگر نمی‌توان مقدار تراز بسیار کوچکی برای عضو ساختار ارائه کرد زیرا اکنون لازم است که @align(n) RequiredAlignOf را برای همه ساختارها تقسیم کند. این تغییر اساسی استفاده از زبان WGSL را ساده‌تر می‌کند و آن را با Firefox و Safari سازگارتر می‌کند. می‌توانید کد نمونه‌ای را که تفاوت بین کامپایلرهای Tint،‏ Naga، و WebKit را نشان می‌دهد در spec PR پیدا کنید.

بهبود عملکرد WGSL با دور انداختن

به‌دلیل افت قابل‌توجه عملکرد مشاهده‌شده هنگام پرداز کردن اثر بازتاب‌های فضای صفحه پیچیده (SSR)، پیاده‌سازی عبارت دور انداختن از معناشناسی ارائه‌شده توسط پلاتفرم برای تنزل دادن به فراخوانی کمکی درصورت دردسترس بودن استفاده می‌کند. این کار عملکرد سایه‌زن‌هایی را که از «دور انداختن» استفاده می‌کنند بهبود می‌بخشد. مشکل ۳۷۲۷۱۴۳۸۴ را ببینید.

استفاده از displaySize در VideoFrame برای بافت‌های خارجی

ابعاد displayWidth و displayHeight باید به‌عنوان اندازه ظاهری GPUExternalTexture هنگام وارد کردن VideoFrame طبق مشخصات WebGPU استفاده شود. بااین‌حال، از اندازه قابل‌مشاهده به‌اشتباه استفاده شده است که باعث ایجاد مشکلاتی هنگام تلاش برای استفاده از textureLoad() در GPUExternalTexture می‌شود. اکنون این مشکل رفع شده است. مشکل ۳۷۷۵۷۴۹۸۱ را ببینید.

بااستفاده از copyExternalImageToTexture، تصاویر با جهت‌گیری غیرپیش‌فرض را مدیریت کنید

از روش copyExternalImageToTexture() GPUQueue برای کپی کردن محتوای تصویر یا بوم در بافت استفاده می‌شود. اکنون تصاویر با جهت‌گیری‌های غیرپیش‌فرض را به‌درستی مدیریت می‌کند. قبلاً وقتی منبع یک ImageBitmap با imageOrientation "from-image" یا تصویری با گرایش غیرپیش‌فرض بود، این‌طور نبود. مشکل ۳۸۴۸۵۸۹۵۶ را ببینید.

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

وقتی adapter.limits مقادیر بالایی را نشان می‌دهد ممکن است تعجب کنید، اما متوجه نمی‌شوید که هنگام درخواست دستگاه GPU باید صریحاً حد بالاتری را درخواست کنید. انجام ندادن این کار می‌تواند منجر به رسیدن غیرمنتظره به محدودیت‌ها در آینده شود.

برای کمک به شما، پیام‌های خطا با نکته‌هایی گسترش یافته است که به شما می‌گوید وقتی در requiredLimits هنگام فراخوانی requestDevice() حد مشخصی تعیین نشده است، به‌طور صریح حد بالاتری را درخواست کنید. مشکل ۴۲۲۴۰۶۸۳ را ببینید.

مثال زیر پیام خطای بهبودیافته‌ای را نشان می‌دهد که هنگام ایجاد بافر GPU با اندازه‌ای فراتر از حد مجاز پیش‌فرض اندازه بافر دستگاه در کنسول DevTools ثبت می‌شود.

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

// Create a GPU buffer with a size exceeding the default max buffer size device limit.
const size = device.limits.maxBufferSize + 1;
const buffer = device.createBuffer({ size, usage: GPUBufferUsage.MAP_READ });

device.queue.submit([]);
⚠️ Buffer size (268435457) exceeds the max buffer size limit (268435456). This adapter supports a higher maxBufferSize of 4294967296, which can be specified in requiredLimits when calling requestDevice(). Limits differ by hardware, so always check the adapter limits prior to requesting a higher limit.
- While calling [Device].CreateBuffer([BufferDescriptor]).

فعال کردن حالت سازگاری با featureLevel

اکنون با تنظیم گزینه استاندارد featureLevel روی "compatibility"، درخواست کردن برای آداپتور GPU در حالت سازگاری آزمایشی امکان‌پذیر است. فقط رشته‌های "core" (پیش‌فرض) و "compatibility" مجاز هستند. مثال زیر و مشخصات درخواست ادغام ۴۸۹۷ را ببینید.

// Request a GPU adapter in compatibility mode
const adapter = await navigator.gpu.requestAdapter({ featureLevel: "compatibility" });

if (adapter?.featureLevel === "compatibility") {
  // Any devices created from this adapter will support only compatibility mode.
}

گزینه featureLevel جایگزین گزینه غیراستاندارد compatibilityMode می‌شود و مشخصه غیراستاندارد featureLevel جایگزین مشخصه isCompatibilityMode می‌شود.

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

پاک‌سازی ویژگی‌های آزمایشی زیرگروه

ویژگی‌های آزمایشی زیرگروه منسوخ‌شده "chromium-experimental-subgroups" و "chromium-experimental-subgroup-uniform-control-flow" برداشته شده است. مشکل ۳۷۷۸۶۸۴۶۸ را ببینید.

اکنون وقتی با زیرگروه‌ها آزمایش می‌کنید، تنها چیزی که نیاز دارید ویژگی آزمایشی "subgroups" است. ویژگی آزمایشی "subgroups-f16" منسوخ شده است و به‌زودی برداشته خواهد شد. وقتی برنامه‌تان هم ویژگی‌های "shader-f16" و هم ویژگی‌های "subgroups" را درخواست می‌کند، می‌توانید از مقادیر f16 با زیرگروه‌ها استفاده کنید. مسئله ۳۸۰۲۴۴۶۲۰ را ببینید.

منسوخ کردن محدودیت maxInterStageShaderComponents

محدودیت maxInterStageShaderComponents به‌دلیل ترکیبی از عوامل منسوخ شده است:

  • افزونگی با maxInterStageShaderVariables: این محدودیت ازقبل هدف مشابهی را دنبال می‌کند و مقدار داده‌های منتقل‌شده بین مراحل سایه‌زن را کنترل می‌کند.
  • اختلافات جزئی: اگرچه تفاوت‌های جزئی در نحوه محاسبه این دو محدودیت وجود دارد، اما این تفاوت‌ها جزئی هستند و می‌توان آن‌ها را به‌طور مؤثر در محدوده maxInterStageShaderVariables مدیریت کرد.
  • ساده‌سازی: برداشتن maxInterStageShaderComponents باعث ساده‌تر شدن میانای سایه‌زن می‌شود و پیچیدگی را برای توسعه‌دهندگان کاهش می‌دهد. به‌جای مدیریت دو حد مجزا با تفاوت‌های ظریف، می‌توانند روی maxInterStageShaderVariables که نام مناسب‌تر و جامع‌تری دارد تمرکز کنند.

هدف این است که آن را به‌طور کامل در Chrome 135 برداریم. قصد منسوخ کردن و مشکل ۳۶۴۳۳۸۸۱۰ را ببینید.

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

‫wgpu::Device::GetAdapterInfo(adapterInfo) به شما امکان می‌دهد اطلاعات آداپتور را مستقیماً از wgpu::Device دریافت کنید. مشکل ۳۷۶۶۰۰۸۳۸ را ببینید.

ساختار WGPUProgrammableStageDescriptor به WGPUComputeState تغییر نام داده است تا وضعیت محاسباتی با وضعیت‌های رأس و قطعه سازگار شود. مشکل ۳۷۹۰۵۹۴۳۴ را ببینید.

مقدار شمارشی wgpu::VertexStepMode::VertexBufferNotUsed برداشته شده است. چیدمان بافر رأس که استفاده نمی‌شود اکنون می‌تواند با {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} بیان شود. مسئله ۳۸۳۱۴۷۰۱۷ را ببینید.

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

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