إطار عمل المزامنة

يصف إطار المزامنة بوضوح التبعيات بين مختلف العمليات غير المتزامنة في نظام الرسومات في Android. إطار العمل توفر واجهة برمجة تطبيقات تتيح للمكونات الإشارة إلى وقت إصدار الموارد الاحتياطية. يعتمد إطار العمل أيضًا يسمح بتمرير أساسيات المزامنة بين برامج التشغيل من النواة مع مساحة المستخدم وبين عمليات مساحة المستخدم نفسها.

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

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

مزامنة صريحة

تمكّن المزامنة الصريحة منتجي المخازن المؤقتة للرسومات ومستهلكيها لإرسال إشارة عند الانتهاء من استخدام مورد احتياطي. المزامنة الصريحة هي تنفيذه في kernel-space.

وتشمل مزايا المزامنة الصريحة ما يلي:

  • انخفاض في الاختلاف في السلوك بين الأجهزة
  • إتاحة تصحيح أفضل
  • مقاييس اختبار محسَّنة

يتضمن إطار عمل المزامنة ثلاثة أنواع من الكائنات:

  • sync_timeline
  • sync_pt
  • sync_fence

مزامنة_المخطط الزمني

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

اتّبِع الإرشادات التالية عند تنفيذ sync_timeline:

  • تقديم أسماء مفيدة لجميع السائقين والمخططات الزمنية والسياجات لتبسيط تصحيح الأخطاء.
  • تنفيذ timeline_value_str وpt_value_str المشغلات في المخططات الزمنية لجعل مخرجات تصحيح الأخطاء أكثر قابلية للقراءة.
  • نفِّذ عملية التعبئة driver_data لمنح مكتبات مساحة المستخدم. مثل مكتبة GL، والوصول إلى بيانات المخطط الزمني الخاص، إذا رغبت في ذلك. يسمح data_driver للمورّدين بتمرير معلومات عن العنصر غير القابل للتغيير sync_fence وsync_pts لإنشاء خطوط أوامر التي تستند إليها.
  • لا تسمح لمساحة المستخدم بإنشاء سياج أو الإشارة إليه بشكل صريح. بشكلٍ صريح يؤدي إنشاء الإشارات/الأسوار إلى هجوم الحرمان من الخدمات الذي يوقف وظائف المسار.
  • عدم الوصول إلى sync_timeline أو sync_pt أو عناصر sync_fence بشكل صريح. توفّر واجهة برمجة التطبيقات جميع البيانات المطلوبة الأخرى.

مزامنة_نقطة

sync_pt هي قيمة مفردة أو نقطة في sync_timeline نقطة هناك ثلاث حالات: نشطة، ومُشار إليها، وخطأ. حالة بدء النقاط نشطة والانتقال إلى حالة وجود إشارة أو خطأ على سبيل المثال، عندما تكون صورة لم يعد المستهلك بحاجة إلى مورد احتياطي، تم إرسال إشارة إلى sync_pt بحيث يعرف منتج الصور أنه من المقبول الكتابة في المخزن المؤقت مرة أخرى.

حد_المزامنة

sync_fence هي مجموعة من sync_pt من القيم. غالبًا لها sync_timeline عناصر رئيسية مختلفة (مثلاً، الشاشة الرئيسية) وحدة التحكم ووحدة معالجة الرسومات). sync_fence وsync_pt و sync_timeline هي الأساسيات الرئيسية التي تستند إليها برامج التشغيل ومساحة المستخدم يستخدمونها لتوصيل تبعياتهم. عندما يتم إشارة السياج، فإن جميع فإن الأوامر الصادرة قبل السياج ستكتمل لأن يُنفذ برنامج تشغيل kernel أو كتلة الأجهزة الأوامر بالترتيب.

يسمح إطار عمل المزامنة للعديد من المستهلكين أو المنتجين بالإشارة إلى الانتهاء من استخدام مورد احتياطي، وتوصيل معلومات التبعية بدالة واحدة . يتم دعم الحدود بواصف ملف ويتم تمريرها من مساحة kernel على مساحة المستخدم. على سبيل المثال، يمكن أن يحتوي السياج على اثنين sync_pt التي تشير إلى إتمام مستهلكَين منفصلَين للصور قراءة مورد احتياطي. عند الإشارة إلى السياج، يعرف منتجو الصور أن كليهما المستهلكون.

تبدأ الحدود، مثل قيم sync_pt، نشطة وتغيّر الحالة بناءً على حالة نقاطه. في حال إرسال إشارات إلى جميع قيم sync_pt، سيتم تصبح الإشارة إلى sync_fence. في حال سقوط sync_pt إلى حالة خطأ، تكون حالة الخطأ في sync_fence بالكامل.

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

لتنفيذ المزامنة الصريحة، يُرجى تقديم ما يلي:

  • يشير هذا المصطلح إلى نظام فرعي بمساحة نواة ينفِّذ إطار عمل المزامنة. لبرنامج تشغيل معين. إن السائقين الذين يحتاجون إلى الوعي بسياج هم هم وبشكل عام أي شيء يدخل إلى أداة إنشاء الأجهزة أو يتصل بها. تشمل الملفات الرئيسية ما يلي:
    • التنفيذ الأساسي:
      • kernel/common/include/linux/sync.h
      • kernel/common/drivers/base/sync.c
    • المستندات في kernel/common/Documentation/sync.txt
    • مكتبة للتواصل مع مساحة النواة في platform/system/core/libsync
  • يجب على المورد توفير المزامنة المناسبة كسياجات كمعاملات لـ validateDisplay() دالة presentDisplay() في HAL.
  • إضافتا GL المرتبطتان بالسياج (EGL_ANDROID_native_fence_sync) وEGL_ANDROID_wait_sync) ودعم السياج في الرسومات السائق.

دراسة حالة: استخدام برنامج تشغيل شاشة

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

/*
 * assumes buffer is ready to be displayed.  returns when buffer is no longer on
 * screen.
 */
void display_buffer(struct dma_buf *buffer);

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

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

/*
 * displays buffer when fence is signaled.  returns immediately with a fence
 * that signals when buffer is no longer displayed.
 */
struct sync_fence* display_buffer(struct dma_buf *buffer, struct sync_fence
*fence);

دمج المزامنة

يوضح هذا القسم كيفية دمج إطار عمل مزامنة kernel-space مع مساحة المستخدم لإطار عمل Android وعوامل التشغيل التي يجب أن توضح مع بعضنا البعض. يتم تمثيل كائنات مساحة النواة كأدوات وصف للملفات في مساحة المستخدم.

اصطلاحات الدمج

اتّبِع اصطلاحات واجهة HAL لنظام التشغيل Android:

  • إذا كانت واجهة برمجة التطبيقات توفّر واصفًا للملفات يشير إلى السمة sync_pt، يجب أن يغلق برنامج تشغيل المورد أو HAL باستخدام واجهة برمجة التطبيقات واصف الملف.
  • إذا مرر برنامج تشغيل المورد أو HAL واصف ملف يحتوي على sync_pt إلى دالة واجهة برمجة التطبيقات، يجب ألا يكون برنامج تشغيل المورد أو HAL لإغلاق واصف الملف.
  • لمتابعة استخدام واصف ملف السياج، أو برنامج تشغيل البائع أو يجب أن تكرّر HAL الواصف.

تتم إعادة تسمية كائن السياج في كل مرة يمر فيها عبر Buffer playlist. يتيح دعم سياج النواة للأسوار وجود سلاسل للأسماء، لذا فإن المزامنة اسم النافذة وفهرس المخزن المؤقت الذي يتم وضعه في قائمة الانتظار لتسمية السياج، مثل SurfaceView:0. هذا النمط مفيد في تصحيح الأخطاء لتحديد مصدر القفل أثناء ظهور الأسماء في ناتج /d/sync وتقارير الأخطاء.

دمج ANativeWindow

ANativeWindow على علم بسياج. dequeueBuffer, وqueueBuffer وcancelBuffer تتضمنان معلَمات سياج.

دمج OpenGL ES

يعتمد دمج مزامنة OpenGL ES على إضافتَين EGL:

  • يوفّر EGL_ANDROID_native_fence_sync وسيلة إنشاء واصفات ملفات سياج Android الأصلية أو التفافها في EGLSyncKHR عناصر
  • تسمح سياسة EGL_ANDROID_wait_sync بالأكشاك من جانب وحدة معالجة الرسومات بدلاً من وحدة المعالجة المركزية (CPU)، ما يجعل وحدة معالجة الرسومات تنتظر EGLSyncKHR. تشير رسالة الأشكال البيانية الإضافة EGL_ANDROID_wait_sync مماثلة للإضافة EGL_KHR_wait_sync.

لاستخدام هذه الإضافات بشكل مستقل، يجب تنفيذ إضافة واحدة (EGL_ANDROID_native_fence_sync) مع الإضافة المرتبطة دعم النواة (النواة). الخطوة التالية هي تفعيل EGL_ANDROID_wait_sync الإضافة في برنامج التشغيل. EGL_ANDROID_native_fence_sync تتكوّن الإضافة من كائن EGLSyncKHR قائم على سياج أصلي مميّز الكتابة. نتيجةً لذلك، يمكن استخدام الإضافات التي تنطبق على EGLSyncKHR الحالية. لا تنطبق أنواع الكائنات بالضرورة على EGL_ANDROID_native_fence. وتجنب التفاعلات غير المرغوب فيها.

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

  • يؤدي واصف ملف سياج صالح إلى تضمين ملف أصلي حالي. واصف ملف السياج لنظام Android في كائن EGLSyncKHR
  • يُنشئ -1 واصفًا أصليًا لملف السياجات لنظام Android من كائن EGLSyncKHR.

استخدام استدعاء الدالة DupNativeFenceFD() لاستخراج كائن EGLSyncKHR من واصف ملف السياج الأصلي في Android. له نفس نتيجة الاستعلام عن السمة set، ولكنه يلتزم الاصطلاح الذي يغلق فيه المستلم السياج (وبالتالي التكرار العملية). أخيرًا، يتم إنهاء عملية تدمير العنصر EGLSyncKHR تصنيف السياج الداخلي.

دمج Machine Composer

تتعامل أداة إنشاء الأجهزة مع ثلاثة أنواع من سياجات المزامنة:

  • يتم تمرير حدود الاكتساب مع الموارد الاحتياطية للإدخال إلى مكالمتا setLayerBuffer وsetClientTarget. وهي تمثل كتابة معلقة في المخزن المؤقت ويجب أن تشير قبل SurfaceFlinger أو HWC يحاول القراءة من المخزن المؤقت المرتبط إلى لأداء التركيب.
  • يتم استرداد إزالة الحدود بعد الاتصال presentDisplay باستخدام مكالمة getReleaseFences. تمثل هذه القيم قراءة معلقة من المخزن المؤقت السابق على نفس الطبقة. حاسمة إطلاق إشارات السياجات عندما لم يعُد "HWC" يستخدم المورد الاحتياطي السابق لأن المخزن المؤقت الحالي حل محل المخزن المؤقت السابق على الشاشة. يتم تمرير حدود الإصدار مرة أخرى إلى التطبيق مع الموارد الاحتياطية السابقة التي سيتم استبداله أثناء المقطوعة الحالية. يجب أن ينتظر التطبيق حتى إطلاق إشارات السياج قبل كتابة محتويات جديدة في المورد الاحتياطي الذي وإعادته إليهم.
  • يتم عرض الأساور الحالية، بمعدل عنصر واحد لكل إطار، كجزء من المكالمة إلى presentDisplay. تمثل الأسوار الحالية متى قد اكتملت تركيبة هذا الإطار أو بالتناوب عند لم تعد هناك حاجة إلى نتيجة تركيب الإطار السابق. للميزات المادية تعرض presentDisplay أسوارًا حالية عند يظهر الإطار الحالي على الشاشة. بعد إرجاع السياجات الحالية، فمن الآمن الكتابة إلى المخزن المؤقت المستهدف SurfaceFlinger مرة أخرى، إذا السارية. بالنسبة إلى شاشات العرض الافتراضية، يتم إرجاع الحدود الحالية عندما للقراءة من المخزن المؤقت للمخرجات.