يُجمِّع "واجهة برمجة التطبيقات لبرنامج Hardware Composer (HWC)" الطبقات التي يتم استلامها من SurfaceFlinger، ما يقلل من مقدار التركيب الذي يؤديه OpenGL ES (GLES) ووحدة معالجة الرسومات.
تُلخِّص واجهة برمجة التطبيقات HWC العناصر، مثل العناصر التي تظهر على سطح الشاشة وأدوات معالجة الصور ثنائية الأبعاد، لتركيب السطوح والتواصل مع الأجهزة المخصّصة لتركيب النوافذ بهدف تركيب النوافذ. يمكنك استخدام HWC مع النوافذ المركبة بدلاً من تركيب SurfaceFlinger مع وحدة معالجة الرسومات. لا يتم تحسين معظم وحدات معالجة الرسومات لأجل التركيب، وعندما تُنشئ وحدة معالجة الرسومات طبقات من SurfaceFlinger، لا يمكن للتطبيقات استخدام وحدة معالجة الرسومات لعرضها.
يجب أن تتيح عمليات تنفيذ HWC ما يلي:
- أربعة عناصر مركّبة على الأقل:
- شريط الحالة
- شريط النظام
- التطبيق
- الخلفية/الخلفية
- الطبقات التي تكون أكبر من الشاشة (مثل الخلفية)
- دمج مسبق للقنوات الشفافة لكل بكسل ودمج مسبق للقنوات الشفافة لكل مستوى
- مسار الجهاز لتشغيل الفيديو المحمي
- ترتيب حزم RGBA وتنسيقات YUV وسمات التجميع والتبديل والخطوة
لتنفيذ HWC:
- تنفيذ وحدة معالجة رسومات عالية الأداء غير عاملة وإرسال جميع أعمال التركيب إلى GLES
- تنفيذ خوارزمية لتفويض التكوين إلى HWC بشكل تدريجي. على سبيل المثال، يمكنك تفويض السطوح الثلاث أو الأربع الأولى فقط إلى الأجهزة المخصّصة للتراكب في وحدة التحكّم في الأجهزة (HWC).
- تحسين "المعالجة السخونة العالية" وقد يشمل ذلك ما يلي:
- اختيار مساحات العرض التي تزيل أكبر قدر من الحمل عن وحدة معالجة الرسومات وإرسالها إلى وحدة التحكّم في الأجهزة
- رصد ما إذا كان يتم تحديث الشاشة أم لا وإذا لم يكن كذلك، يمكنك تفويض عملية التركيب إلى GLES بدلاً من HWC لتوفير الطاقة. عندما يتم تعديل الشاشة مرة أخرى، واصِل تفريغ محتوى التركيب إلى وحدة التحكّم في الأجهزة (HWC).
- الاستعداد لحالات الاستخدام الشائعة، مثل:
- الشاشة الرئيسية التي تتضمّن شريط الحالة وشريط النظام ونافذة التطبيق والخلفيات الحية
- تشغيل الألعاب في وضع ملء الشاشة بالوضعين العمودي والأفقي
- فيديو في وضع ملء الشاشة مع ترجمة وشرح والتحكّم في التشغيل
- تشغيل الفيديوهات المحمية
- نوافذ متعددة في وضع "تقسيم الشاشة"
المواد الأساسية لـ HWC
يوفر HWC قاعدتين، هما طبقات وشاشات عرض، لتمثيل أعمال التركيب وتفاعلها مع أجهزة العرض. يوفّر HWC أيضًا إمكانية التحكم في VSYNC واستدعاء SurfaceFlinger لإشعاره عند وقوع حدث VSYNC.
واجهة HIDL
يستخدم الإصدار 8.0 من نظام التشغيل Android والإصدارات الأحدث واجهة
HIDL تُعرف باسم Composer HAL لسماح واجهة برمجة التطبيقات بالاتصال بين HWC وSurfaceFlinger. تحل HAL للمؤلف محل
واجهة hwcomposer2.h
القديمة. إذا قدّم المورّدون تنفيذًا لواجهة برمجة التطبيقات Composer HAL لوحدة التحكّم في الأجهزة (HWC)، ستقبل واجهة برمجة التطبيقات Composer HAL مباشرةً طلبات HIDL من واجهة برمجة التطبيقات
SurfaceFlinger. إذا كان المورّدون يوفّرون تنفيذًا قديمًا لواجهة HWC، يحمِّل Composer
HAL مؤشرات الدوال من hwcomposer2.h
، ويوجّه استدعاءات HIDL إلى استدعاءات مؤشرات الدوال.
يوفّر HWC دوال لتحديد خصائص شاشة معيّنة، وللتبديل بين إعدادات الشاشة المختلفة (مثل دقة 4k أو 1080p) وأوضاع الألوان (مثل الألوان الأصلية أو sRGB الحقيقي)، ولتشغيل الشاشة أو إيقافها أو ضبطها على وضع استهلاك الطاقة المنخفض إذا كان ذلك متاحًا.
مؤشرات الدوالّ
إذا نفّذ المورّدون Composer HAL مباشرةً، تطلب SurfaceFlinger دوالها من خلال HIDL IPC. على سبيل المثال، لإنشاء طبقة، يُطلِق SurfaceFlinger createLayer()
على Composer HAL.
إذا نفَّذ المورّدون واجهة hwcomposer2.h
، يُطلِق Composer HAL
مُشيرات دوال hwcomposer2.h
. في تعليقات hwcomposer2.h
،
يُشار إلى دوال واجهة HWC
بأسماء DownCamelCase غير الموجودة في الواجهة
كحقول مُسمّاة. يتم تحميل كل دالة تقريبًا من خلال طلب إشارة دالة باستخدام getFunction
المقدَّمة من hwc2_device_t
. على سبيل المثال، الدالة createLayer
هي مؤشر دالة من النوع HWC2_PFN_CREATE_LAYER
، ويتم عرضه عند تمرير القيمة العددية HWC2_FUNCTION_CREATE_LAYER
إلى getFunction
.
للحصول على مستندات تفصيلية عن دوال HAL في Compose ودوال مرور دوال HWC،
يُرجى الاطّلاع على composer
. للحصول على مستندات تفصيلية حول مؤشرات وظائف HWC، يُرجى الاطّلاع على hwcomposer2.h
.
أسماء الطبقات والشاشات
يتمّ التحكّم في الطبقات والشاشات باستخدام الأسماء المعرِّفة التي ينشئها "المعالج اللاسلكي للوسائط". لا يمكن لـ SurfaceFlinger الوصول إلى الأسماء المعرِّفة.
عندما ينشئ SurfaceFlinger طبقة جديدة، يستدعي createLayer
،
الذي يعرض نوع Layer
للتنفيذات المباشرة
أو hwc2_layer_t
للتنفيذات المباشرة. عندما يعدّل
SurfaceFlinger خاصية من تلك الطبقة، يُرسِل SurfaceFlinger قيمةhwc2_layer_t
إلى وظيفة التعديل المناسبة
بالإضافة إلى أي معلومات أخرى مطلوبة لإجراء التعديل. النوع
hwc2_layer_t
كبير بما يكفي للاحتفاظ إما بمؤشر أو
فهرس.
يتم إنشاء الشاشات المادية من خلال التوصيل المباشر. عند توصيل شاشة خارجية
باستخدام تقنية hotplug، ينشئ HWC معرّفًا ويمرره إلى SurfaceFlinger
من خلال دالة الاستدعاء hotplug. يتم إنشاء الشاشات الافتراضية من خلال SurfaceFlinger
وطلب createVirtualDisplay()
لطلب عرض. إذا كان HWC
يتوافق مع تركيب العرض الافتراضي، سيعرض معرّفًا. بعد ذلك، يفوّض SurfaceFlinger
إنشاء شاشات العرض إلى HWC. إذا كان HWC لا يتوافق مع تركيب الشاشة
الافتراضية، سينشئ SurfaceFlinger المقبض ويركب الشاشة.
عمليات تركيب العرض
مرة واحدة لكل VSYNC، يتم تنشيط SurfaceFlinger إذا كان بها محتوى جديد مركب. يمكن أن يكون هذا المحتوى الجديد هو ذاكرة تخزين مؤقتة جديدة للصور من التطبيقات أو تغيير في سمات طبقة واحدة أو أكثر. عندما يوقظه SurfaceFlinger:
- تعالج المعاملات، في حال توفّرها.
- يلتقط التخزين المؤقت الجديد للرسومات، إن وجد.
- يُجري إنشاءً جديدًا إذا أدت الخطوة 1 أو 2 إلى تغيير في محتوى العرض.
لتنفيذ تركيبة جديدة، ينشئ SurfaceFlinger طبقات ويدمرها أو يعدّل حالاتها، حسب الاقتضاء. ويُعدّل أيضًا
الطبقات باستخدام محتوياتها الحالية، باستخدام طلبات مثل
setLayerBuffer
أو setLayerColor
. بعد تعديل كل الطبقات، يُطلِق SurfaceFlinger validateDisplay
، ما يطلب من "وحدة معالجة الرسومات" (HWC) فحص حالة الطبقات وتحديد كيفية مواصلة عملية الدمج. يحاول SurfaceFlinger بشكل تلقائي تهيئة كل طبقة بحيث يتم تكوين الطبقة بواسطة HWC، ومع ذلك في بعض الظروف، ينشئ SurfaceFlinger طبقات من خلال الإجراء الاحتياطي لوحدة معالجة الرسومات.
بعد استدعاء validateDisplay
، يُطلِق SurfaceFlinger getChangedCompositionTypes
لمعرفة ما إذا كان HWC يريد تغيير أي من أنواع تركيب الطبقات قبل تنفيذ عملية التركيب. لقبول التغييرات، يُطلِق SurfaceFlinger acceptDisplayChanges
.
إذا تم وضع علامة على أي طبقات لدمج SurfaceFlinger، يُدمجها SurfaceFlinger
في المخزن المؤقت المستهدف. يستدعي SurfaceFlinger بعد ذلك
setClientTarget
لمنح المخزن المؤقت للشاشة بحيث
يمكن عرض المخزن المؤقت على الشاشة أو تركيبه بشكل أكبر بطبقات لم يتم تحديدها لتكوين SurfaceFlinger. إذا لم يتم وضع علامة على أي طبقات لتركيب
SurfaceFlinger، يتخطّى SurfaceFlinger خطوة التركيب.
أخيرًا، يُطلِق SurfaceFlinger presentDisplay
لإعلام
HWC بإكمال عملية التركيب وعرض النتيجة النهائية.
شاشات عرض متعددة
يتيح نظام Android 10 استخدام شاشات عرض متعددة. عند تصميم عملية تنفيذ HWC مخصّصة للاستخدام على الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث، هناك بعض القيود غير المضمّنة في تعريف HWC:
- من المفترض أن تكون هناك شاشة داخلية واحدة فقط. الشاشة الداخلية هي الشاشة التي تُبلغ عنها ميزة hotplug الأولية أثناء التشغيل. بعد توصيل الشاشة الداخلية، لا يمكن فصلها.
- بالإضافة إلى الشاشة الداخلية، قد يتم توصيل أي عدد من الشاشات الخارجية بمصدر طاقة أثناء التشغيل العادي للجهاز. يفترض إطار العمل أنّ جميع المقابس الآمنة بعد الشاشة الداخلية الأولى هي شاشات خارجية، لذا في حال إضافة المزيد من الشاشات الداخلية، يتم تصنيفها بشكل غير صحيح على أنّها
Display.TYPE_HDMI
بدلاً منDisplay.TYPE_BUILT_IN
.
على الرغم من أنّ عمليات SurfaceFlinger الموضّحة أعلاه يتم إجراؤها لكل شاشة عرض، يتم تنفيذها بالتسلسل مع كل الشاشات النشطة، حتى إذا تم تحديث محتوى شاشة واحدة فقط.
على سبيل المثال، إذا تم تعديل الشاشة الخارجية، تكون التسلسلية على النحو التالي:
// In Android 9 and lower: // Update state for internal display // Update state for external display validateDisplay(<internal display>) validateDisplay(<external display>) presentDisplay(<internal display>) presentDisplay(<external display>) // In Android 10 and higher: // Update state for internal display // Update state for external display validateInternal(<internal display>) presentInternal(<internal display>) validateExternal(<external display>) presentExternal(<external display>)
تكوين الشاشة الافتراضية
تشبه تركيبة الشاشة الافتراضية تركيبة الشاشة الخارجية. يتمثل الفرق بين تركيبة الشاشة الافتراضية وتركيبة الشاشة الحقيقية في أنّ الشاشات الافتراضية ترسل الإخراج إلى ذاكرة تخزين مؤقتة في Gralloc بدلاً من إرسالها إلى الشاشة. يكتب "أداة إنشاء المحتوى بالأجهزة" (HWC) الإخراج في ذاكرة تخزين مؤقت، ويقدّم حاجز اكتمال، ويرسل ذاكرة التخزين المؤقت إلى مستهلك (مثل مؤلف محتوى الفيديو ووحدة معالجة الرسومات ووحدة المعالجة المركزية وما إلى ذلك). يمكن أن تستخدم الشاشات الافتراضية رسومًا ثنائية الأبعاد أو رسومًا متراكبة إذا كان مسار عرض البيانات يكتب في الذاكرة.
الأوضاع
يكون كل إطار في أحد الأوضاع الثلاثة بعد أن يستدعي SurfaceFlinger validateDisplay()
طريقة HWC:
- GLES - تجمع وحدة معالجة الرسومات جميع الطبقات، وتكتب مباشرةً في المخزن المؤقت للمخرجات. لا يشارك "المحتوى الذي ينشئه المستخدم" في عملية إنشاء المحتوى.
- MIXED: تعمل وحدة معالجة الرسومات على تركيب بعض الطبقات مع المخزن المؤقت للإطارات كما يركب HWC المخزن المؤقت للإطارات والطبقات المتبقية ويكتب مباشرةً في المخزن المؤقت للمخرجات.
- HWC: يُدمج هذا الوضع جميع الطبقات ويكتبها مباشرةً في ذاكرة التخزين المؤقت للإخراج.
تنسيق الإخراج
تعتمد تنسيقات إخراج المخزن المؤقت للعرض الافتراضي على الوضع الخاص بها:
- وضع GLES: يضبط برنامج تشغيل EGL تنسيق ملف تخزين الإخراج
في
dequeueBuffer()
، وعادةً ما يكونRGBA_8888
. يجب أن يتمكّن المستهلك من قبول تنسيق الإخراج الذي يضبطه برنامج التشغيل أو لن تتمكّن من قراءة ملف التخزين المؤقت. - وضعا MIXED وHWC: إذا كان المستهلك بحاجة إلى الوصول إلى وحدة المعالجة المركزية، يضبط المستهلك التنسيق. بخلاف ذلك، يكون التنسيق هو
IMPLEMENTATION_DEFINED
، ويضبط Gralloc أفضل تنسيق استنادًا إلى علامات الاستخدام. على سبيل المثال، يضبط Gralloc تنسيق YCbCr إذا كان المستهلك هو برنامج ترميز الفيديو ويمكن لوحدة HWC كتابة التنسيق بكفاءة.
حدود المزامنة
تشكل حدود المزامنة (المزامنة) جانبًا مهمًا من نظام رسومات Android. تسمح الحواجز لعمل وحدة المعالجة المركزية (CPU) بالتقدّم بشكل مستقل عن عمل وحدة معالجة الرسومات (GPU) المتزامن، ولا يتم حظر أيّ عمليات إلا عند توفّر ترابط حقيقي.
على سبيل المثال، عندما يُرسِل تطبيق ذاكرة تخزين مؤقت يتم إنشاؤها على GPU، يُرسِل أيضًا عنصر حدود مزامنة. يشير هذا الفاصل إلى انتهاء مكتمل عملية الكتابة في ذاكرة التخزين المؤقت من قِبل وحدة معالجة الرسومات.
تتطلب وحدة المعالجة المركزية (HWC) أن تنتهي وحدة معالجة الرسومات من انتهاء المخازن المؤقتة للكتابة قبل عرض الوحدات الاحتياطية. يتم تمرير حدود المزامنة عبر مسار الرسومات باستخدام المخزن المؤقت والإشارات عند كتابة المخزن المؤقت. قبل عرض المخزن المؤقت، يتحقق "المعالج الدقيق للوسائط" مما إذا كان قد تم إرسال إشارة من حاجز المزامنة، وإذا تم ذلك، يعرض المعالج المخزن المؤقت.
لمزيد من المعلومات عن حدود المزامنة، يُرجى الاطّلاع على مقالة دمج Hardware Composer.