AIDL لطبقة HAL في Hardware Composer

بدءًا من الإصدار 13 من نظام التشغيل Android، يتم تحديد طبقة تجريد الأجهزة (HAL) الخاصة بـ Hardware Composer (HWC) في AIDL، وتم إيقاف إصدارات HIDL التي تتراوح بين android.hardware.graphics.composer@2.1 وandroid.hardware.graphics.composer@2.4 نهائيًا.

توضّح هذه الصفحة الاختلافات بين AIDL وHIDL HAL الخاصَين بـ HWC، كما توضّح عملية تنفيذ واختبار AIDL HAL.

نظرًا إلى المزايا التي توفّرها لغة AIDL، ننصح المورّدين بتنفيذ AIDL لواجهة HAL الخاصة بمكوّن إنشاء الصور والفيديوهات بدءًا من الإصدار 13 من نظام التشغيل Android بدلاً من إصدار HIDL. راجِع قسم التنفيذ للحصول على مزيد من المعلومات.

الاختلافات بين AIDL وHIDL HAL

يتم تعريف واجهة HAL الجديدة لبرنامج التأليف المستند إلى AIDL، والتي تحمل الاسم android.hardware.graphics.composer3، في IComposer.aidl. تعرض هذه الواجهة واجهة برمجة تطبيقات مشابهة لواجهة HIDL HAL android.hardware.graphics.composer@2.4 مع إجراء التغييرات التالية:

  • إزالة قائمة انتظار الرسائل السريعة (FMQ) واستخدام أوامر قابلة للتسلسل بدلاً منها

    يحدّد AIDL HAL واجهة الأوامر استنادًا إلى أنواع قابلة للتسلسل ومكتوبة بشكل صارم، وذلك على عكس الأوامر المتسلسلة عبر FMQ في HIDL. يوفّر ذلك واجهة ثابتة للأوامر وتعريفًا أكثر قابلية للقراءة حول كيفية تفسير حمولة الأمر.

    يتم تحديد طريقة executeCommands في IComposerClient.aidl على النحو التالي:

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    حيث يمثل كل أمر نوعًا قابلاً للتجزئة ومحدّد النوع بشكل صارم، ويتم تعريفه في DisplayCommand.aidl. ردود الأوامر هي حِزم قابلة للتسلسل ومحدّدة الأنواع بوضوح، ويتم تعريفها في CommandResultPayload.aidl.

  • إزالة IComposerClient.getClientTargetSupport لأنّه ما من عملاء نشطين لهذه الطريقة

  • تمثيل الألوان كأرقام عشرية بدلاً من وحدات بايت لتتوافق بشكل أفضل مع حزمة الرسومات العليا في نظام التشغيل Android كما هو محدّد في ASurfaceTransaction_setColor.

  • إضافة حقول جديدة للتحكّم في محتوى HDR

    في AIDL HAL، تتيح حِزم الطبقات المختلطة SDR/HDR التعتيم السلس لطبقات SDR عندما تكون طبقة HDR معروضة على الشاشة في الوقت نفسه.

    يتيح الحقل brightness في LayerCommand لـ SurfaceFlinger تحديد مستوى سطوع لكل طبقة، ما يتيح لـ HWC خفض سطوع محتوى الطبقة في مساحة الضوء الخطي، بدلاً من مساحة غاما.

    يتيح الحقل brightness في ClientTargetPropertyWithBrightness لجهاز HWC تحديد مساحة السطوع الخاصة بتركيب العميل، كما يتيح توجيه RenderEngine بشأن ما إذا كان سيتم تعتيم طبقات SDR في تركيب العميل.

    يتيح الحقل dimmingStage لـ HWC ضبط الوقت الذي يجب أن تخفّض فيه RenderEngine سطوع المحتوى. يستوعب ذلك ColorModes الذي يحدّده المورّد، والذي قد يفضّل التعتيم في مساحة غاما، للسماح بتحسينات التباين التي يحدّدها المورّد في مسارات الألوان.

  • تمت إضافة نوع تركيبة جديد DISPLAY_DECORATION في Composition.aidl للزخارف على الشاشة.

    تتضمّن بعض الأجهزة أجهزة مخصّصة لتحسين رسم قناع ألفا الذي يعمل على تنعيم الزوايا الدائرية والفتحات في الشاشات. يجب أن تتضمّن الأجهزة التي تتضمّن مثل هذه الأجهزة IComposerClient.getDisplayDecorationSupport لعرض بنية DisplayDecorationSupport على النحو المحدّد في DisplayDecorationSupport.aidl الجديد. يصف هذا البناء تعدادات PixelFormat وAlphaInterpretation التي يتطلبها الجهاز. بعد تنفيذ ذلك، ستصنّف واجهة مستخدم النظام طبقة قناع ألفا على أنّها DISPLAY_DECORATION، وهو نوع تركيب جديد يستفيد من الأجهزة المخصّصة.

  • تمت إضافة حقل expectedPresentTime جديد إلى DisplayCommand.aidl.

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

  • إضافة واجهات برمجة تطبيقات جديدة للتحكّم في إعدادات عرض شاشة بدء التشغيل

    باستخدام BOOT_DISPLAY_CONFIG، يمكن للمورّدين تحديد ما إذا كان إعداد شاشة بدء التشغيل متوافقًا. تستخدِم طرق setBootDisplayConfig وclearBootDisplayConfig وgetPreferredBootDisplayConfig BOOT_DISPLAY_CONFIG على النحو التالي:

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

    • باستخدام clearBootDisplayConfig، يُعلم إطار العمل المورّدين بإزالة إعدادات شاشة العرض عند بدء التشغيل، ويتم بدء التشغيل باستخدام إعدادات شاشة العرض المفضّلة لديهم عند إعادة التشغيل التالية.

    • باستخدام getPreferredBootDisplayConfig، يطلب إطار العمل وضع التشغيل المفضّل لدى المورّد.

    عندما لا يكون إعداد شاشة بدء التشغيل متاحًا، تعرض هذه الطرق القيمة UNSUPPORTED.

  • إضافة واجهات برمجة تطبيقات جديدة للتحكّم في مؤقّت عدم النشاط على الشاشة

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

    • يشير استخدام وظيفة الاستدعاء IComposerCallback.onVsyncIdle إلى المنصة بأنّ الشاشة غير نشطة وأنّ وتيرة vsync قد تغيّرت. تستجيب المنصة لعملية معاودة الاتصال هذه من خلال إعادة ضبط نموذج vsync. يفرض ذلك إعادة مزامنة vsync في الإطار التالي، ويتعرّف على vsync الجديد.

التنفيذ

لا يُطلب من المورّدين تنفيذ AIDL HAL لنظام التشغيل Android 13. ومع ذلك، ننصحهم بتنفيذ واجهة AIDL الخاصة ببرنامج HAL الخاص بالمؤلف بدلاً من إصدار HIDL لاستخدام الوظائف وواجهات برمجة التطبيقات الجديدة.

يتم تنفيذ تنفيذ مرجعي لواجهة AIDL HWC HAL في محاكيات Android.

الاختبار

لاختبار عملية التنفيذ، شغِّل VtsHalGraphicsComposer3_TargetTest.