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

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

تاریخ انتشار: 29 ژانویه 2025

فرمت‌های unorm8x4-bgra و راس 1 جزء اضافی

فرمت راس "unorm8x4-bgra" و قالب‌های راس 1 جزء زیر اضافه شده است: "uint8" , "sint8" , "unorm8" " , " "snorm8" , "uint16" , "sint16" , "unorm16" , "snorm16" ، و "float16" . فرمت راس "unorm8x4-bgra" بارگذاری رنگ‌های راس کدگذاری شده با BGRA را در عین حفظ سایه‌زن یکسان، کمی راحت‌تر می‌کند. علاوه بر این، فرمت راس 1 جزء به شما امکان می‌دهد فقط داده‌هایی را درخواست کنید که زمانی که قبلاً حداقل دو برابر بیشتر برای انواع داده‌های 8 و 16 بیتی مورد نیاز بود، درخواست کنید. ورودی chromestatus و شماره 376924407 را ببینید.

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

برای اینکه WebGPU API در طول تکامل کمتر شکننده شود، اکنون می توانید هنگام درخواست یک دستگاه GPU، محدودیت های ناشناخته با مقدار undefined درخواست کنید. این در کد برنامه زیر مفید است، برای مثال در جایی که adapter.limits.someLimit می‌تواند undefined باشد، اگر someLimit دیگر وجود نداشته باشد. مشخصات 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 استفاده می کنند. به شماره 372714384 مراجعه کنید.

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

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

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

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

بهبود تجربه توسعه دهندگان

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

برای کمک به شما، پیام‌های خطا همراه با نکاتی گسترش یافته‌اند که به شما می‌گوید در هنگام فراخوانی requestDevice() ، صراحتاً محدودیت بالاتری را درخواست کنید، زمانی که هیچ محدودیتی در requiredLimits مشخص نشده است. به شماره 42240683 مراجعه کنید.

مثال زیر هنگام ایجاد یک بافر 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 جایگزین گزینه non-standardized compatibilityMode می شود در حالی که ویژگی non-standardized featureLevel جایگزین ویژگی isCompatibilityMode می شود.

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

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

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

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

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

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

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

هدف حذف کامل آن در Chrome 135 است. به قصد منسوخ کردن و صدور 364338810 مراجعه کنید.

به روز رسانی سحر

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

ساختار WGPUProgrammableStageDescriptor به WGPUComputeState تغییر نام داده است تا حالت محاسبه با حالت های راس و قطعه سازگار باشد. شماره 379059434 را ببینید.

مقدار wgpu::VertexStepMode::VertexBufferNotUsed enum حذف شده است. یک طرح بافر راس که استفاده نمی شود اکنون می تواند با {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0} بیان شود. شماره 383147017 را ببینید.

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

چه چیزی در WebGPU جدید است

فهرستی از همه چیزهایی که در سری What's New in WebGPU پوشش داده شده است.

کروم 133

کروم 132

کروم 131

کروم 130

کروم 129

کروم 128

کروم 127

کروم 126

کروم 125

کروم 124

کروم 123

کروم 122

کروم 121

کروم 120

کروم 119

کروم 118

کروم 117

کروم 116

کروم 115

کروم 114

کروم 113