تنفيذ طبقة HAL لأداة إنشاء الأجهزة

طبقات HAL المركبة في Composer (HWC) التي تم تلقّيها من SurfaceFlinger، يتم تقليل مقدار تركيبة OpenGL ES (GLES) وأداء وحدة معالجة الرسومات.

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

يجب أن توفِّر عمليات تنفيذ "مركز الخدمة الرئيسية" ما يلي:

  • أربعة تراكبات على الأقل:
    • شريط الحالة
    • شريط النظام
    • التطبيق
    • الخلفية/الخلفية
  • الطبقات التي أكبر من الشاشة (على سبيل المثال، خلفية)
  • مزج ألفا مضاعفة مسبقًا لكل بكسل ولكل مستوى في الوقت نفسه مزج ألفا
  • مسار الجهاز لتشغيل الفيديو المحمي
  • طلب التعبئة والتغليف بنموذج أحمر أخضر أزرق وتنسيقات YUV والبلاط والتدوير والتخطي المواقع

لتنفيذ HWC:

  1. تنفيذ HWC غير تشغيلي وإرسال كل أعمال المقطوعة الموسيقية إلى GLES.
  2. تنفيذ خوارزمية لتفويض التكوين إلى HWC بشكل تدريجي. على سبيل المثال، تفويض أول ثلاثة أو أربعة أسطح فقط إلى التراكب لأجهزة HWC.
  3. تحسين "HWC" وقد يشمل ذلك ما يلي:
    • يتيح تحديد الأسطح التي تزيد الحِمل الناتجة من وحدة معالجة الرسومات وترسلها إلى HWC.
    • رصد ما إذا كان يتم تحديث الشاشة أم لا إذا لم يكن كذلك، قم باستخدام تفويض إلى GLES بدلاً من HWC لتوفير الطاقة. عندما تظهر الشاشة يتم تحديثه مرة أخرى، يمكنك مواصلة نقل التركيبة إلى HWC.
    • التحضير لحالات الاستخدام الشائعة مثل:
      • الشاشة الرئيسية، التي تتضمن شريط الحالة وشريط النظام والتطبيق والنوافذ والخلفيات المتحركة
      • ألعاب ملء الشاشة في الوضعَين العمودي والأفقي
      • فيديو بملء الشاشة مع ترجمة وشرح وتشغيل التحكّم
      • تشغيل فيديو محمي
      • نوافذ متعددة في وضع "تقسيم الشاشة"

المواد الأساسية لـ HWC

يوفر HWC قاعدتين، طبقتين وشاشات عرض، أعمال التركيب وتفاعلها مع أجهزة العرض. تشير رسالة الأشكال البيانية توفّر HWC أيضًا إمكانية التحكُّم في VSYNC ومعاودة الاتصال بـ SurfaceFlinger. لإبلاغه عند وقوع حدث VSYNC.

واجهة HIDL

في الإصدار Android 8.0 والإصدارات الأحدث واجهة HIDL التي تسمى HAL للمؤلف تنسيق IPC بين HWC وSurfaceFlinger. يحل محل HAL للمؤلف واجهة hwcomposer2.h القديمة. في حال وفّر المورِّدون طبقة HAL للمؤلف تنفيذ HWC، يقبل Composer HAL مباشرةً من طلبات HIDL من SurfaceFlinger. إذا قدّم المورّدون تنفيذًا قديمًا لـ HWC، في Composer يحمّل HAL مؤشرات الدالة من hwcomposer2.h، إعادة توجيه استدعاءات HIDL إلى استدعاءات مؤشر الوظائف.

يوفر HWC دوال لتحديد خصائص شاشة عرض معينة. إلى التبديل بين إعدادات العرض المختلفة (مثل 4k أو 1080p) درجة الدقة) وأوضاع الألوان (مثل اللون الأصلي أو sRGB الحقيقية) ولتحويل تشغيل الشاشة أو إيقافها أو تحويلها إلى وضع الطاقة المنخفضة إذا كان ذلك متاحًا.

مؤشرات الدوال

إذا نفّذ المورّدون Composer HAL مباشرةً، يستدعي SurfaceFlinger دواله. من خلال HIDL IPC. على سبيل المثال، لإنشاء طبقة، يستدعي SurfaceFlinger createLayer() على HAL للمؤلف.

إذا نفّذ المورّدون واجهة hwcomposer2.h، سيتم إنشاء HAL في Composer. لاستدعاء مؤشرات الدوال hwcomposer2.h. في hwcomposer2.h تعليق، دوال واجهة HWC التي يُشار إليها بأسماء miniCamelCase غير موجودة في الواجهة كحقول مُسماة. يتم تحميل كل دالة تقريبًا عن طريق طلب مؤشر الدالة باستخدام getFunction المقدمة من hwc2_device_t على سبيل المثال، الدالة createLayer هو مؤشر الدوال من النوع HWC2_PFN_CREATE_LAYER، وهو يتم عرضه عندما يتم تعداد القيمة HWC2_FUNCTION_CREATE_LAYER يتم تمريره إلى getFunction.

للحصول على وثائق تفصيلية حول دوال HAL في Composer وعبور دالة HWC الدوال، يُرجى الاطّلاع على composer. للحصول على وثائق تفصيلية حول مؤشرات دالة HWC، راجع hwcomposer2.h

مقابض الطبقات والعرض

يتم معالجة الطبقات والشاشات من خلال الأسماء المعرِّفة التي يتم إنشاؤها بواسطة HWC. المقابض معتمة لجهاز SurfaceFlinger.

عندما ينشئ SurfaceFlinger طبقة جديدة، يطلق عليها createLayer، الذي يكون ناتجًا من النوع Layer للعمليات المباشرة أو hwc2_layer_t لعمليات تنفيذ العبور. فعندما يعدّل SurfaceFlinger خاصية تلك الطبقة، ويمرر SurfaceFlinger. قيمة hwc2_layer_t في دالة التعديل المناسبة إلى جانب أي معلومات أخرى لازمة لإجراء التعديل. تشير رسالة الأشكال البيانية النوع hwc2_layer_t كبير بما يكفي للاحتفاظ إما بمؤشر أو الفهرس.

يتم إنشاء الشاشات المادية من خلال التوصيل المباشر. عندما يتم تشغيل شاشة عندما يكون الجهاز متصلًا بمصدر طاقة، ينشئ مقبضًا ويمرر المقبض إلى SurfaceFlinger. من خلال الاتصال السريع. من إنشاء SurfaceFlinger الشاشات الافتراضية جارٍ الاتصال بالرقم createVirtualDisplay() لطلب شاشة. إذا كان HWC يتيح إنشاء شاشة افتراضية، فسيتم عرض مقبض. بعد ذلك، SurfaceFlinger يفوض أجهزة العرض إلى HWC. إذا لم يكن HWC يتيح تركيب شاشة العرض، ينشئ SurfaceFlinger المقبض ويركب الشاشة.

عمليات تكوين شاشة العرض

مرة واحدة لكل VSYNC، يتم تنشيط SurfaceFlinger إذا كان هناك محتوى جديد مُركّب. يمكن أن يكون هذا المحتوى الجديد مخازن مؤقتة جديدة للصور من التطبيقات أو حدوث تغيير في خصائص طبقة واحدة أو أكثر. عند استخدام SurfaceFlinger يوقظه:

  1. تعالج المعاملات، إن وجدت.
  2. يلتقط التخزين المؤقت الجديد للرسومات، إن وجد.
  3. يؤدي مقطوعة موسيقية جديدة إذا أدت الخطوة 1 أو 2 إلى تغيير إلى محتوى الشاشة

لتأليف مقطوعة موسيقية جديدة، ينشئ SurfaceFlinger تدمير الطبقات أو تعدِّل حالات الطبقات، حسب الاقتضاء. إنه يقوم أيضًا بتحديث مع محتوياتها الحالية، واستخدام استدعاءات مثل setLayerBuffer أو setLayerColor بعد أن تصبح جميع الطبقات تم تحديثه، يطلب SurfaceFlinger validateDisplay، والذي يخبر HWC لفحص حالة الطبقات وتحديد كيفية تفاعل التركيبة المتابعة. يحاول SurfaceFlinger ضبط كل طبقة بشكل تلقائي بحيث تتكوّن الطبقة بواسطة HWC، رغم ذلك في بعض الظروف، يقوم SurfaceFlinger بتركيب الطبقات من خلال الإجراء الاحتياطي لوحدة GPU.

بعد الاتصال برقم validateDisplay، يتصل SurfaceFlinger. getChangedCompositionTypes لمعرفة ما إذا كان HWC يريد أي نوع من أنواع تركيب الطبقات التي تم تغييرها قبل تنفيذ المقطوعة الموسيقية. لقبول التغييرات، تطلب SurfaceFlinger. acceptDisplayChanges

إذا تم تحديد أي طبقات لتركيب SurfaceFlinger، يكون SurfaceFlinger ويضيفها إلى المورد الاحتياطي المستهدف. SurfaceFlinger ثم يستدعي setClientTarget لتوفير المخزن المؤقت للشاشة بحيث يمكن عرض المخزن المؤقت على الشاشة أو تكوينه بشكل أكبر بطبقات لم يتم وضع علامة عليها لتكوين SurfaceFlinger. إذا لم يتم تحديد أي طبقات تركيب SurfaceFlinger، يتجاوز SurfaceFlinger خطوة التركيب.

أخيرًا، تستدعي SurfaceFlinger presentDisplay لإخبار HWC لإكمال عملية التركيب وعرض النتيجة النهائية.

شاشات عرض متعددة

يتوافق Android 10 مع شاشات عرض مادية متعددة. عند تصميم تنفيذ HWC مخصص للاستخدام على Android 7.0 أعلى، هناك بعض القيود غير الواردة في تعريف HWC:

  • من المفترض أن تكون هناك شاشة داخلية واحدة فقط. الفريق الداخلي هي الشاشة التي تقاريرها المقبس السريع الأولي أثناء . بعد توصيل الشاشة الداخلية بمصدر طاقة، سيتعذّر على الشاشة .
  • بالإضافة إلى الشاشة الداخلية، قد يتم توصيل أي عدد من الشاشات الخارجية بشكل متصل بالإنترنت. أثناء التشغيل العادي للجهاز. يفترض إطار العمل أن جميع مقابس التشغيل السريع بعد أول شاشة داخلية هي شاشات خارجية، لذلك إذا كان هناك إضافة شاشات داخلية، يتم تصنيفها بشكل غير صحيح على أنها 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 المؤقت بدلاً من الشاشة. ويكتب Device Composer (HWC) الإخراج في مخزن مؤقت، وتوفر حدود الإكمال، وترسل المورد الاحتياطي إلى المستهلك (مثل برنامج ترميز الفيديو ووحدة معالجة الرسومات ووحدة المعالجة المركزية (CPU) وما إلى ذلك). يمكن للشاشات الافتراضية استخدام 2D/Bremeter أو ظهور لوحة مفاتيح في حال كان مسار العرض يكتب إلى الذاكرة.

الأوضاع

يكون كل إطار في أحد الأوضاع الثلاثة بعد أن يستدعي SurfaceFlinger طريقة validateDisplay() HWC:

  • GLES — تجمع وحدة معالجة الرسومات جميع الطبقات، وتكتب مباشرة إلى المخزن المؤقت للمخرج. لا يتدخل HWC في أي تركيبة.
  • MIXED — تعمل وحدة معالجة الرسومات على تركيب بعض الطبقات ويركب المخزن المؤقت للإطارات وHWC المخزن المؤقت للإطارات والطبقات المتبقية، الكتابة مباشرة إلى المورد الاحتياطي للمخرجات.
  • HWC: يركب "HWC" جميع الطبقات ويكتب مباشرةً إلى المورد الاحتياطي للمخرج.

تنسيق الإخراج

تعتمد تنسيقات إخراج المخزن المؤقت للعرض الافتراضي على الوضع الخاص بها:

  • وضع GLES: يضبط برنامج تشغيل EGL المخزن المؤقت للإخراج. بتنسيق dequeueBuffer()، عادةً RGBA_8888. يجب أن يتمكّن المستهلك من قبول تنسيق الإخراج الذي يضبطه برنامج التشغيل أو لا يمكن قراءة المخزن المؤقت.
  • الوضع المختلط ووضع HWC: إذا احتاج المستهلك إلى وحدة المعالجة المركزية (CPU) حق الوصول، يقوم المستهلك بتعيين التنسيق. خلاف ذلك، فإن التنسيق هو ويضبط IMPLEMENTATION_DEFINED و Gralloc أفضل تنسيق استنادًا إلى علامات الاستخدام. على سبيل المثال، يضبط Gralloc تنسيق YCbCr إذا كان المستهلك برنامج ترميز الفيديو وHWC كتابة التنسيق بكفاءة.

سياجات المزامنة

حدود المزامنة (المزامنة) هي جانب مهم في رسومات Android . تتيح أسوار تشغيل وحدة المعالجة المركزية (CPU) العمل بشكل مستقل عن عمل وحدة معالجة الرسومات المتزامنة، الحظر فقط عندما يكون هناك تبعية حقيقية.

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

يتطلب HWC أن تنتهي وحدة معالجة الرسومات من كتابة الموارد الاحتياطية قبل المعالجة. المعروضة. تمر حدود المزامنة عبر مسار الرسومات مع المخازن المؤقتة والإشارة عند كتابة الموارد الاحتياطية. قبل عرض المخزن المؤقت، يتم استخدام HWC يتحقّق مما إذا كانت قد أشارت سياج المزامنة، وإذا تم ذلك، سيعرض المورد الاحتياطي.

لمزيد من المعلومات عن حدود المزامنة، يمكنك الاطّلاع على أداة إنشاء الأجهزة. الدمج: