الميزات الجديدة في WebGPU (إصدار Chrome 133)

François Beaufort
François Beaufort

تاريخ النشر: 29 يناير 2025

تنسيقات إضافية للرؤوس ذات المكوّن الواحد بتنسيق unorm8x4-bgra

تمت إضافة تنسيق الرأس "unorm8x4-bgra" وتنسيقات الرأس المكوّنة من عنصر واحد التالية: "uint8" و"sint8" و"unorm8" و"snorm8" و"uint16" و"sint16" و"unorm16" و"snorm16" و"float16". يجعل تنسيق الرأس "unorm8x4-bgra" تحميل ألوان الرأس المشفرة بتنسيق BGRA أكثر ملاءمةً مع الحفاظ على برنامج التظليل نفسه. بالإضافة إلى ذلك، يتيح لك تنسيق الرأس المكوّن من عنصر واحد طلب البيانات الضرورية فقط، بينما كان مطلوبًا في السابق ضعف هذا المقدار على الأقل لأنواع البيانات ذات 8 و16 بت. يُرجى الاطّلاع على إدخال chromestatus والمشكلة 376924407.

السماح بطلب حدود غير معروفة بقيمة غير محدّدة

لجعل واجهة برمجة التطبيقات WebGPU أقل عرضة للتعطّل مع تطوّرها، يمكنك الآن طلب حدود غير معروفة باستخدام القيمة 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 وزيادة توافقها مع Firefox وSafari. يمكنك العثور على نموذج رمز يعرض الاختلافات بين برامج التجميع Tint وNaga وWebKit في طلب السحب الخاص بالمواصفات.

تحسين أداء WGSL باستخدام الأمر discard

بسبب الانخفاض الكبير في الأداء الذي تم رصده عند عرض تأثير انعكاسات معقّدة في مساحة الشاشة (SSR)، يستخدم تنفيذ عبارة discard الدلالات التي توفّرها المنصة للرجوع إلى استدعاء مساعد عند توفّره. يؤدي ذلك إلى تحسين أداء برامج التظليل التي تستخدم الأمر discard. يمكنك الاطّلاع على المشكلة 372714384.

استخدام VideoFrame displaySize للنسيج الخارجي

يجب استخدام السمتَين displayWidth وdisplayHeight كحجم ظاهر للعنصر GPUExternalTexture عند استيراد VideoFrame وفقًا لمواصفات WebGPU، ولكن تم استخدام الحجم المرئي بشكل غير صحيح ما تسبّب في حدوث مشاكل عند محاولة استخدام textureLoad() على GPUExternalTexture. نودّ إعلامك بأنّه تمّ الآن إصلاح هذه المشكلة. اطّلِع على المشكلة 377574981.

التعامل مع الصور ذات الاتجاهات غير التلقائية باستخدام copyExternalImageToTexture

يتم استخدام طريقة copyExternalImageToTexture() GPUQueue لنسخ محتوى صورة أو لوحة رسم إلى مادة. أصبحت الآن تعالج بشكل صحيح الصور ذات الاتجاهات غير التلقائية. لم يكن هذا هو الحال من قبل عندما كان المصدر ImageBitmap مع imageOrientation "from-image" أو صورة ذات اتجاه غير تلقائي. راجِع المشكلة 384858956.

تحسين تجربة المطوّرين

قد يكون من المفاجئ أن تعرض adapter.limits قيمًا عالية، ولكن لا تدرك أنّك بحاجة إلى طلب حد أعلى بشكل صريح عند طلب جهاز وحدة معالجة الرسومات. وقد يؤدي عدم إجراء ذلك إلى تجاوز الحدود بشكل غير متوقّع في وقت لاحق.

لمساعدتك، تم توسيع رسائل الخطأ لتشمل تلميحات تطلب منك طلب حدّ أعلى بشكل صريح عندما لم يتم تحديد أي حدّ في requiredLimits عند استدعاء requestDevice(). اطّلِع على المشكلة 42240683.

يوضّح لك المثال التالي رسالة خطأ محسّنة تم تسجيلها في وحدة تحكّم "أدوات مطوّري البرامج" عند إنشاء مخزن مؤقت لوحدة معالجة الرسومات بحجم يتجاوز الحدّ الأقصى التلقائي لحجم المخزن المؤقت على الجهاز.

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". إنّ السلسلتَين "core" (القيمة التلقائية) و"compatibility" هما القيمتان الوحيدتان المسموح بهما. اطّلِع على المثال التالي وطلب السحب الخاص بالمواصفات رقم 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.

بما أنّ هذه الميزة لا تزال تجريبية، عليك تشغيل Chrome باستخدام العلامة "Unsafe WebGPU Support" على chrome://flags/#enable-unsafe-webgpu في الوقت الحالي. يمكنك تجربة هذه الميزة من خلال الانتقال إلى webgpureport.org.

تنظيف ميزات المجموعة الفرعية التجريبية

تتم إزالة ميزات المجموعات الفرعية التجريبية "chromium-experimental-subgroups" و"chromium-experimental-subgroup-uniform-control-flow" التي تم إيقافها نهائيًا. اطّلِع على المشكلة 377868468.

"subgroups" الميزة التجريبية هي كل ما تحتاج إليه الآن عند تجربة المجموعات الفرعية. تم إيقاف الميزة التجريبية "subgroups-f16" نهائيًا وستتم إزالتها قريبًا. يمكنك استخدام قيم f16 مع المجموعات الفرعية عندما يطلب تطبيقك ميزتَي "shader-f16" و"subgroups". يمكنك الاطّلاع على المشكلة 380244620.

إيقاف حدّ maxInterStageShaderComponents نهائيًا

تم إيقاف الحدّ الأقصى البالغ maxInterStageShaderComponents بسبب مجموعة من العوامل:

  • التكرار مع maxInterStageShaderVariables: يخدم هذا الحدّ بالفعل غرضًا مشابهًا، وهو التحكّم في كمية البيانات التي يتم تمريرها بين مراحل التظليل.
  • الاختلافات الطفيفة: على الرغم من وجود اختلافات طفيفة في طريقة احتساب الحدّين، إلا أنّ هذه الاختلافات بسيطة ويمكن إدارتها بفعالية ضمن الحدّ maxInterStageShaderVariables.
  • التبسيط: يؤدي إزالة maxInterStageShaderComponents إلى تبسيط واجهة برنامج التظليل وتقليل التعقيد للمطوّرين. وبدلاً من إدارة حدّين منفصلين مع اختلافات طفيفة، يمكنهم التركيز على maxInterStageShaderVariables الأكثر شمولاً والأكثر ملاءمةً.

والهدف هو إزالتها بالكامل في الإصدار 135 من Chrome. يُرجى الاطّلاع على إشعار الإيقاف النهائي والمشكلة 364338810.

إشعارات الفجر

تتيح لك wgpu::Device::GetAdapterInfo(adapterInfo) الحصول على معلومات المحوّل مباشرةً من wgpu::Device. اطّلِع على المشكلة رقم 376600838.

تمت إعادة تسمية بنية WGPUProgrammableStageDescriptor إلى WGPUComputeState لجعل حالة الحساب متوافقة مع حالات الرأس والجزئيات. اطّلِع على المشكلة 379059434.

تمت إزالة قيمة التعداد wgpu::VertexStepMode::VertexBufferNotUsed. يمكن الآن التعبير عن تنسيق مخزن مؤقت للرؤوس غير مستخدَم باستخدام {.stepMode=wgpu::VertexStepMode::Undefined, .attributeCount=0}. راجِع المشكلة 383147017.

هذا يشمل بعض النقاط الرئيسية فقط. اطّلِع على القائمة الشاملة لعمليات الإيداع.

الميزات الجديدة في WebGPU

قائمة بكل ما تم تناوله في سلسلة الميزات الجديدة في WebGPU

Chrome 140

‫Chrome 139

‫Chrome 138

‫Chrome 137

Chrome 136

Chrome 135

Chrome 134

Chrome 133

‫Chrome 132

Chrome 131

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