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

François Beaufort
François Beaufort

تاريخ النشر: 29 كانون الثاني (يناير) 2025

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

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

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

لجعل WebGPU API أقلّ هشاشة أثناء تطويرها، يمكنك الآن طلب حدود غير معروفة باستخدام القيمة 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 باستخدام ميزة "الاستبعاد"

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

استخدِم سمة displaySize في VideoFrame للعناصر الخارجية.

يجب استخدام السمتَين 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" هما القيمتان الوحيدتان المسموح بهما. راجِع المثال التالي والمواصفة 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.

بما أنّ هذه الميزة لا تزال تجريبية، عليك تشغيل Chrome مع إضافة العلامة "Unsafe WebGPU Support" (دعم WebGPU غير الآمن) في 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.

إيقاف الحد الأقصى لعدد مكوّنات shader في مرحلة ما نهائيًا

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

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

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

آخر الأخبار من Dawn

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

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

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

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

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

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

Chrome 133

Chrome 132

Chrome 131

Chrome 130

الإصدار 129 من Chrome

Chrome 128

الإصدار 127 من Chrome

الإصدار 126 من Chrome

الإصدار 125 من Chrome

Chrome 124

Chrome 123

Chrome 122

الإصدار 121 من Chrome

الإصدار 120 من Chrome

الإصدار 119 من Chrome

Chrome 118

Chrome 117

Chrome 116

Chrome 115

الإصدار 114 من Chrome

Chrome 113