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

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

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

فرمت‌های رأس اضافی unorm8x4-bgra و 1-component

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

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

برای اینکه API وب‌جی‌پی‌یو در حین تکامل، کمتر شکننده باشد، اکنون می‌توانید هنگام درخواست یک دستگاه GPU، محدودیت‌های ناشناخته با مقدار undefined درخواست کنید. این در کد برنامه زیر مفید است، به عنوان مثال، در صورتی که someLimit دیگر وجود نداشته باشد، adapter.limits.someLimit می‌تواند undefined باشد. به مشخصات PR 4781 مراجعه کنید.

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 را ساده کرده و آن را با فایرفاکس و سافاری سازگارتر می‌کند. می‌توانید نمونه کدی را که تفاوت‌های بین کامپایلرهای Tint، Naga و WebKit را نشان می‌دهد، در مشخصات PR بیابید.

افزایش عملکرد WGSL با حذف

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

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

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

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

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

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

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

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

مثال زیر یک پیام خطای بهبود یافته را که هنگام ایجاد یک بافر 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

درخواست آداپتور GPU در حالت سازگاری آزمایشی اکنون با تنظیم گزینه استاندارد featureLevel روی "compatibility" امکان‌پذیر است. رشته‌های "core" (پیش‌فرض) و "compatibility" تنها مقادیر مجاز هستند. به مثال زیر و مشخصات PR 4897 مراجعه کنید.

// 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 می‌شود.

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

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

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

ویژگی آزمایشی "subgroups" تنها چیزی است که اکنون هنگام آزمایش زیرگروه‌ها به آن نیاز دارید. ویژگی آزمایشی "subgroups-f16" منسوخ شده و به زودی حذف خواهد شد. وقتی برنامه شما هر دو ویژگی "shader-f16" و "subgroups" را درخواست می‌کند، می‌توانید از مقادیر f16 برای زیرگروه‌ها استفاده کنید. به شماره 380244620 مراجعه کنید.

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

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

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

هدف حذف کامل آن در کروم ۱۳۵ است. به intent to deprecate and issue 364338810 مراجعه کنید.

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

تابع wgpu::Device::GetAdapterInfo(adapterInfo) به شما امکان می‌دهد اطلاعات آداپتور را مستقیماً از یک wgpu::Device دریافت کنید. به شماره 376600838 مراجعه کنید.

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

مقدار شمارشی wgpu::VertexStepMode::VertexBufferNotUsed حذف شده است. طرح‌بندی بافر رأسی که استفاده نمی‌شود، اکنون می‌تواند با {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} بیان شود. به شماره ۳۸۳۱۴۷۰۱7 مراجعه کنید.

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

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

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

کروم ۱۴۲

کروم ۱۴۱

کروم ۱۴۰

کروم ۱۳۹

کروم ۱۳۸

کروم ۱۳۷

کروم ۱۳۶

کروم ۱۳۵

کروم ۱۳۴

کروم ۱۳۳

کروم ۱۳۲

کروم ۱۳۱

کروم ۱۳۰

کروم ۱۲۹

کروم ۱۲۸

کروم ۱۲۷

کروم ۱۲۶

کروم ۱۲۵

کروم ۱۲۴

کروم ۱۲۳

کروم ۱۲۲

کروم ۱۲۱

کروم ۱۲۰

کروم ۱۱۹

کروم ۱۱۸

کروم ۱۱۷

کروم ۱۱۶

کروم ۱۱۵

کروم ۱۱۴

کروم ۱۱۳